C++ 应用程序(调试版)包含 VS 运行时库 msvcr90.dll 和 msvcr90d.dll

Posted

技术标签:

【中文标题】C++ 应用程序(调试版)包含 VS 运行时库 msvcr90.dll 和 msvcr90d.dll【英文标题】:C++ application(debug version) contains VS runtime libraries msvcr90.dll and 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 也许你是对的。但是有数百个库(我们在不同的文件夹中都有库的调试/发布版本)。有什么工具可以用吗? 【参考方案1】:

我找到了答案!

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

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

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

【讨论】:

以上是关于C++ 应用程序(调试版)包含 VS 运行时库 msvcr90.dll 和 msvcr90d.dll的主要内容,如果未能解决你的问题,请参考以下文章

VS2013,C++:未知的“线程 X 以代码 0 退出”

Visual C++:发布模式的运行时库作为“多线程调试 DLL”

VS2012 如何在输出窗口中打印调试信息 C++语言

Visual Studios 2012 更改运行时库会导致链接错误,使用 C++

C++ 应用程序仅在使用本地 Windows 调试器时运行,而不是在哪个 exe 文件中运行

VC运行时库(/MD/MT等)