1

我正在编写一个使用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

4

2 回答 2

2

不,不幸的是,这些是 VS2008 调试运行时 DLL(末尾的“D”)。官方不允许您分发它们。

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

  1. 获取源代码并使用 VS2010 自己重建它(这也将允许您对其进行调试,这对于理解/发现库的问题很有用)
  2. 安装 VS2008 C++(无论是否表达)并使用它来代替。

我打算建议让构建器为您重新构建版本,但仍然存在 2008 与 2010 的问题。

于 2012-05-10T10:07:33.567 回答
1

对于您的主要问题,Rup 是对的。关于混合 VS2008/VS2010 运行时,可以这么说:

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

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

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

  • 使用libA, libB headers不会在运行时创建 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;
};
于 2012-05-10T11:11:02.193 回答