【问题标题】:C++ application(debug version) contains VS runtime libraries msvcr90.dll and msvcr90d.dllC++ 应用程序(调试版)包含 VS 运行时库 msvcr90.dll 和 msvcr90d.dll
【发布时间】:2016-08-23 06:53:07
【问题描述】:

我正在使用 VS2008 创建我的应用程序的调试版本。 编译后,当我尝试运行应用程序时,我得到了著名的“MSVCR90.dll is missing”错误。

最初我尝试将 MSVCR90.dll 从 winsxs 文件夹复制到应用程序文件夹中,但又遇到另一个著名错误“应用程序尝试错误地加载 C 运行时库”

最后我尝试检查应用程序的依赖关系,它发现了一些奇怪的东西。有两个 MSVCR90 库作为应用程序的依赖项 - msvcr90d.dll 和 msvcr90.dll。我不是这个库的非调试版本如何进入我的应用程序的。

我可能做错了什么。提前致谢。

这是一张图片:

dependency walker - no functions visible

【问题讨论】:

  • 您可以使用 Dependency Walker 查看您的应用程序正在从 msvcr90.dll 导入哪些函数
  • 猜猜:你正在链接一个在发布模式下构建的外部库。
  • 我试图将 MSVCR90.dll 从 winsxs 文件夹复制到应用程序文件夹中 - 不要这样做 - 通常最好使用安装运行时安装程序。 有两个 MSVCR90 库作为应用程序的依赖项 - msvcr90d.dll 和 msvcr90.dll - 有人(您或静态库)针对运行时的发布版本构建了一些东西。您将需要遍历每个库和项目才能找到它。没有足够的细节来诊断运行时不匹配的根源。
  • @Ari0nhh 我尝试这样做,但依赖项步行器除了“打开指定文件时出错”之外没有显示任何内容 - 我将上传它的照片。
  • @RichardCritten 也许你是对的。但是有数百个库(我们在不同的文件夹中都有库的调试/发布版本)。有什么工具可以用吗?

标签: c++ dll


【解决方案1】:

我找到了答案!

我使用 /VERBOSE:LIB 链接器标志来找出链接的哪一部分将 MSVCR90.dll(release) 库添加到我的应用程序中。

后来在 libs/exe 中使用 /NODEFAULTLIB:MSVCRT.lib 链接器标志来避免库的 MSVCRT.lib(release) 版本并在链接期间强制“无冲突”。这将避免在您的可执行文件/库中出现两个版本的 MSVCRT 库引用。

注意:如果您想在应用程序中避免使用 MSVCRT 的调试版本,则可以使用 /NODEFAULTLIB:MSVCRTD.lib

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多