为啥我的发布版本仍在寻找调试 DLL (MSVCR110D.dll)?
Posted
技术标签:
【中文标题】为啥我的发布版本仍在寻找调试 DLL (MSVCR110D.dll)?【英文标题】:Why is my release build still looking for a debug DLL (MSVCR110D.dll)?为什么我的发布版本仍在寻找调试 DLL (MSVCR110D.dll)? 【发布时间】:2015-08-04 07:53:45 【问题描述】:我有与this question 类似的问题。我正在构建一个依赖于其他几个 DLL 的 DLL。自然,在安装 VS2012 的机器上以调试模式编译时,一切正常。然后我开始在发布模式下编译所有依赖项,创建发布 DLL。
当我在安装了 Visual C++ 运行时的全新 Windows 7 机器上部署它们时,主 DLL 不会加载,因为它仍然要求 MSVCR110D.dll
。
DependencyWalker 向我展示了这个(抱歉审查,我无法显示名称,但我为发布模式构建留下了 r
后缀):
如您所见,它引用了 Visual C++ 运行时的发行版。即使在整个依赖 DLL 树下,也只有对发布运行时 DLL 的引用:
有一个引用 MSVCR80.dll
的延迟加载 DLL,但实际上从未真正加载过,这也不是我遇到的错误。
问题是:我如何找出为什么它仍然依赖于调试运行时?哪个DLL,哪个函数调用负责?如果不通过 DependencyWalker,我可以使用哪些工具和哪些步骤来追踪它?
【问题讨论】:
【参考方案1】:我发现 DependencyWalker 没有显示正确的依赖项。有效的是使用 Visual Studio 命令提示符和 dumpbin
程序:
dumpbin /dependents YourDLL.dll
这将列出所有依赖项,然后您可以从那里向下走。我最终找到了罪魁祸首——一个引用了 MSVCRd.dll
的依赖 DLL,而在 DependencyWalker 中没有显示。
Dump of file XXXXXXXr.dll
File Type: DLL
Image has the following dependencies:
AVIFIL32.dll
MSVCR110D.dll <------------------------ HERE
WMVCore.DLL
WINMM.dll
KERNEL32.dll
USER32.dll
ole32.dll
OLEAUT32.dll
MSVCP110.dll
Summary
9000 .data
12000 .rdata
5000 .reloc
1000 .rsrc
48000 .text
然后我必须转到此 DLL 的构建配置,并在链接器选项中将 msvcrd.lib
的依赖关系更改为 msvcr.lib
。
【讨论】:
以上是关于为啥我的发布版本仍在寻找调试 DLL (MSVCR110D.dll)?的主要内容,如果未能解决你的问题,请参考以下文章
在 vs2015 中发布 coco2dx 应用程序到 win7 msvcr110.dll 缺少 dll
我的调试版dll使用了redistributable和crash的发布版
SidBySide:第 3 方 Dll 指的是 MSVCR80.DLL 的两个版本
问题:CMD安装mysql-server遇到找不到MSVCR120.dll问题(已解决)
Visual Studio 2013 Reference Hell - 它一直在寻找任何不存在的旧版本的 DLL - 为啥?