缺少MSVCR90D.dll

时间:2012-05-10 10:05:25

标签: c++ sfml

我正在编写一个使用SFML 1.6的C ++程序(32位)。发布版本可以编译和运行而没有问题,而调试版本也可以编译而没有问题,但无法运行。 Dependency Walker表明SFML的调试版本需要MSVCR90D.dll和MSVCP90D.dll。我的硬盘上找不到这两个文件。我自己没有编译SFML(我已经下载了二进制文件),之前没有注意到它是用Visual Studio 2008编译的,而我使用的是VS 2010 Express。所以我认为下载VS 2008可再发行组件可以解决问题,但事实并非如此。现在我不确定使用旧编译器版本编译的库是否是一个好主意。

有关我做错的任何建议吗?我需要安装哪些可再发行组件来获取那些丢失的DLL?

PS:我使用的是Win7 64

2 个答案:

答案 0 :(得分:2)

不,不幸的是那些是VS2008调试运行时DLL(最后的'D')。你没有被正式允许分发它们。

请注意,在编译器版本之间混合C ++是危险的。您的选择可能是

  1. 获取源代码并使用VS2010自行重建(这也允许您调试它,这对理解/发现库的问题很有用)
  2. 安装VS2008 C ++(表达与否)并改为使用它。
  3. 我打算建议让建设者重新构建为你的版本,但仍然存在2008年和2010年的问题。

答案 1 :(得分:1)

对于你的主要问题,Rup是对的。关于混合VS2008 / VS2010运行时,请说:

  • libA.dll是依赖于VS2008 DLL运行时的ABI(链接时);
  • libB.dll是依赖于VS2010 DLL运行时的ABI。

根据我的经验,在VS项目中使用libA.dlllibB.dll发布版本是安全的,只要:

  • 您正确地将libAlibB联系起来(在链接器输入中选择正确的libA.liblibB.lib);

  • 使用libAlibB 标头不会在运行时创建ABI不匹配,具体取决于混合的VS2008 / VS2010标头(例如STL)

例如:

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