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

缺少MSVCR90D.dll 我正在编写一个C++程序(32位)。发布版本可以编译并运行而没有问题,而调试版本也可以编译而没有问题,但无法运行。显示SFML的调试版本需要MSVCR90D.dll和MSVCP90D.dll。在我的硬盘上找不到这两个文件。我自己没有编译SFML(我已经下载了二进制文件),之前也没有注意到它是用Visual Studio 2008编译的,而我使用的是VS 2010 Express。所以我认为下载VS2008可再发行版本可以解决问题,但事实并非如此。现在我不确定使用使用旧版本编译器编译的库是否是一个好主意,c++,sfml,C++,Sfml,对我做错了什么有什么建议吗?我需要安装哪种可再发行软件才能获得丢失的DLL PS:我使用的是Win7 64否,不幸的是,这些是VS2008调试运行时DLL(末尾的“D”)。官方不允许你分发它们 注意,编译器版本之间的C++混合是危险的。你的选择可能是 掌握源代码并使用VS2010自行重建(这也将允许您调试到源代码中,这对于理解/发现库中的问题非常有用) 安装VS2008 C++(Express或No.+),并与之一起工作。 我本来打算建议让构建器为您重新构建为发行版,但仍然存在2008年与201

对我做错了什么有什么建议吗?我需要安装哪种可再发行软件才能获得丢失的DLL


PS:我使用的是Win7 64

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

<>注意,编译器版本之间的C++混合是危险的。你的选择可能是

  • 掌握源代码并使用VS2010自行重建(这也将允许您调试到源代码中,这对于理解/发现库中的问题非常有用)
  • 安装VS2008 C++(Express或No.+),并与之一起工作。

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

    对于您的主要问题,Rup是正确的。关于混合VS2008/VS2010运行时,假设:

    • libA.dll
      是依赖于VS2008 dll运行时的ABI(链接时间)
    • libB.dll
      ABI依赖于VS2010 dll运行时
    根据我的经验,在VS项目中使用
    libA.dll
    libB.dll
    release版本是安全的,只要:

    • 您正在正确地进行友好链接
      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;
    };
    
    //libA.h
    #包括
    类LibAClass
    {
    私人:
    //这是不安全的,警告c4251:libA的用户可能会分配不同的大小
    //这段代码可以在运行时完美地编译
    //它可能会导致问题(我自己验证)
    std::vector\u列表;
    //只要libA的用户不需要
    //直接与*\u listp打交道
    std::vector*_listp;
    };
    
    通常会咬到你的那只,混合对象是在两个分配之间分配的吗?有两个不同的运行时间,有两个不同的分配堆,您需要确保只有2008个代码分配的对象被2008代码释放。还有版本间可能存在的微小的C++ abi变化。在某些GCC版本之间发生,因为它们优化/调试ABI和名称混乱方案。发布/调试应该无关紧要。您是正确的。也请阅读我的编辑。损坏也是一个大问题,但我认为VS2010/VS2008是100%(或非常接近)兼容的。我想说的是,如果你知道你在做什么,混合依赖VS2008/VS2010运行时是相当安全的。但是,损坏并不是你真正需要担心的:如果他们改变了损坏方案,那么他们几乎肯定会以一种破坏性的方式改变ABI。无声的ABI更改更是一个问题。