为什么我的发布版本仍然在寻找调试DLL(MSVCR110D.dll)?

时间:2015-08-04 07:53:46

标签: c++ visual-studio-2012 dll

我与this question有类似的问题。我正在构建一个依赖于其他几个DLL的DLL。当然,在安装VS2012的机器上以调试模式编译时,一切都可以正常工作。然后我开始在发布模式下编译所有依赖项,创建发布DLL。

当我在安装了Visual C ++ Runtime的全新Windows 7计算机上部署它们时,主DLL无法加载,因为它仍然要求MSVCR110D.dll

DependencyWalker向我展示了这一点(对于审查很抱歉,我无法显示名称,但我为发布模式构建留下了r后缀):

如您所见,它引用了Visual C ++运行时的发行版。即使是依赖于DLL的整个树,也只有对发布运行时DLL的引用:

有一个延迟加载的DLL引用MSVCR80.dll,但它实际上从未实际加载过,而且这也不是我得到的错误。

问题是:如何找出为什么它仍然取决于调试运行时?哪个函数调用负责哪个DLL?如果不是通过DependencyWalker,我可以使用哪些工具和步骤来跟踪它?

1 个答案:

答案 0 :(得分:3)

我发现DependencyWalker没有显示正确的家属。有用的是使用Visual Studio命令提示符和dumpbin程序:

dumpbin /dependents YourDLL.dll

这将列出所有家属,从那里你可以走到树下。我最终找到了罪魁祸首 - 一个引用MSVCRd.dll的依赖DLL,它在DependencyWalker中显示 not

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