2012-05-10 19 views
1

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

私が間違っていることに関する提案はありますか?これらのDLLが見つからないようにするには、どの再配布可能ファイルをインストールする必要がありますか?

PS:私はWin7の64

答えて

2

を使用していません、残念ながらそれらはVS2008のデバッグランタイムDLL(最後の 'D')です。公式に配布することは許可されていません。

コンパイラのバージョン間でC++を混在させることは危険です。あなたのオプションは、おそらく

  1. ある(これはまた、あなたが理解/ライブラリの問題を発見するのに有用であることができ、それにデバッグすることができます)
  2. VS2008 Cをインストールソースのホールドを取得し、VS2010でそれを自分で再構築++ (表現するかしないか)、その代わりにそれを使用してください。

私はビルダーをあなたのためのリリースとして再構築することを提案しようとしていましたが、2008年と2010年の問題はまだあります。

+0

Rupのは、また、私の答えをお読みください。 – ceztko

1

あなたの主な質問については、Rupが正しいです。 VS2008/VS2010ランタイムを混合については、以下のことを言わせて:

  • libA.dllはVS2008 DLLランタイムに依存ABI(リンク時)です。
  • libB.dllは、VS2010 DLLランタイムに依存するABIです。私の経験で

は、それは限り、あなたのVSのプロジェクトの両方のlibA.dlllibB.dllのビルドとしてリリースを使用しても安全です:

  • あなたは正しくdinamically libAlibBをリンクされている(正しい選択リンカー入力のlibA.libおよびlibB.lib)。 (例えば、STLのための)混合VS2008/VS2010ヘッダに応じて、実行時にABIミスマッチを作成しないlibAlibBヘッダーを使用して

  • 。例えば

// 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; 
}; 
+0

しかし、あなたを噛んでしまう普通のものは、2つの異なるランタイムと2つの異なるランタイムで、2008コードで割り当てられたオブジェクトだけが2008コードなどで解放されるようにする必要があるオブジェクトです。バージョン間に存在するかもしれないマイナーなC++ ABIの変更もあります - 実際にVC++があるかどうかわかりませんが、GBIバージョン間ではABIやネームマングリングスキームの改良/デバッグが行われます。リリース/デバッグは問題ではありません。 – Rup

+0

あなたは正しいです。私の編集内容も読んでください。マングリングも大きな問題ですが、私はVS2010/VS2008が100%(あるいは非常に近い)互換性があると思います。 VS2008/VS2010のランタイムへの依存を混在させることは、あなたが何をしているのか分かっていれば、かなり安全です。 – ceztko

+0

マングリングはあなたが心配する必要が本当にありません:彼らがmanglingスキームを変更した場合、彼らはほとんど確実にABIを壊れた方法で変更しました。サイレントなABIの変更はさらに問題になります。 – Rup