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的主要内容,如果未能解决你的问题,请参考以下文章
Visual C++:发布模式的运行时库作为“多线程调试 DLL”
Visual Studios 2012 更改运行时库会导致链接错误,使用 C++