为啥我的发布版本仍在寻找调试 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 的两个版本

C++ FLTK 1.30 MSVCR120.dll 丢失

问题:CMD安装mysql-server遇到找不到MSVCR120.dll问题(已解决)

Visual Studio 2013 Reference Hell - 它一直在寻找任何不存在的旧版本的 DLL - 为啥?