1

SFML 1.6を使用する C++ プログラム (32 ビット) を作成しています。リリース ビルドは問題なくコンパイルおよび実行できますが、デバッグ ビルドも問題なくコンパイルされますが、実行できません。Dependency Walkerは、SFML のデバッグ バージョンには MSVCR90D.dll と MSVCP90D.dll が必要であることを示しています。両方のファイルがハード ドライブに見つかりません。私は自分で SFML をコンパイルしませんでした (バイナリをダウンロードしました)。以前は、VS 2010 Express を使用しているのに Visual Studio 2008 でコンパイルされていることに気付きませんでした。そのため、VS 2008 再頒布可能パッケージをダウンロードすれば問題は解決すると思いましたが、解決しませんでした。古いバージョンのコンパイラでコンパイルされたライブラリを使用することが一般的に良い考えかどうかはわかりません。

私が間違っていることについて何か提案はありますか?これらの不足している DLL を取得するには、どの再頒布可能ファイルをインストールする必要がありますか?

PS: Win7 64 を使用しています。

4

2 に答える 2

2

いいえ、残念ながら、これらは VS2008 デバッグ ランタイム DLL (末尾の「D」) です。それらを配布することは正式に許可されていません。

コンパイラのバージョン間で C++ を混在させることは危険であることに注意してください。あなたの選択肢はおそらく

  1. ソースを入手し、VS2010 で自分で再構築します (これにより、ライブラリの問題を理解/発見するのに役立つデバッグも可能になります)
  2. VS2008 C++ (express または not) をインストールし、代わりにそれを使用します。

ビルダーをリリースとして再ビルドすることを提案するつもりでしたが、2008 対 2010 の問題がまだ残っています。

于 2012-05-10T10:07:33.567 に答える
1

主な質問については、Rup が正しいです。VS2008/VS2010 ランタイムの混合に関しては、次のように言いましょう。

  • libA.dllVS2008 DLL ランタイムに依存する ABI (リンク時間) です。
  • libB.dllVS2010 DLL ランタイムに依存する ABI です。

私の経験では、両方のリリースビルドを使用してもlibA.dlllibB.dllVS プロジェクトでも安全です。

  • andを正しく動的にリンクlibAしているlibB(リンカー入力で正しいlibA.libandlibB.libを選択している);

  • を使用するlibAと、VS2008/VS2010 ヘッダーの混合 (STL など) に応じて、実行時にlibB ヘッダーの ABI の不一致が作成されません。

例えば:

// libA.h

#include <vector>  

class LibAClass
{
private:
    // This is unsafe, warning c4251: users of libA may allocate a different size
    // than expected for the vector. The code can perfectly compile but at runtime
    // it can cause problems (verified myself)
    std::vector _list;

    // The following is safe as long as users of libA are not required to
    // deal directly with *_listp
    std::vector *_listp;
};
于 2012-05-10T11:11:02.193 に答える