我正在编写一个使用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
答案 0 :(得分:2)
不,不幸的是那些是VS2008调试运行时DLL(最后的'D')。你没有被正式允许分发它们。
请注意,在编译器版本之间混合C ++是危险的。您的选择可能是
我打算建议让建设者重新构建为你的版本,但仍然存在2008年和2010年的问题。
答案 1 :(得分:1)
对于你的主要问题,Rup是对的。关于混合VS2008 / VS2010运行时,请说:
libA.dll
是依赖于VS2008 DLL运行时的ABI(链接时); libB.dll
是依赖于VS2010 DLL运行时的ABI。根据我的经验,在VS项目中使用libA.dll
和libB.dll
的发布版本是安全的,只要:
您正确地将libA
和libB
联系起来(在链接器输入中选择正确的libA.lib
和libB.lib
);
使用libA
,libB
标头不会在运行时创建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;
};