【问题标题】:msvcr90d.dll not found in debug mode在调试模式下找不到 msvcr90d.dll
【发布时间】:2010-11-12 03:16:14
【问题描述】:

我找到了MSVCR90D.dll not found in debug mode with Visual C++ 2008 问题,但没有一个给出的答案真正给出了问题的答案。他们中的大多数都指向关闭增量链接,但没有解释错误的真正原因以及如何在关闭增量链接的情况下修复它。

我想提一下,我的情况与原始问题中的情况略有不同。我正在使用 Visual Studio 2008 中的 C++ 编译器,但在 Qt Creator 中而不是在 Visual Studio 中。

有人吗?

【问题讨论】:

标签: c++ visual-studio-2008 visual-c++ linker msvcr90d.dll


【解决方案1】:

只需安装 VS2008 Service Pack 1 即可解决问题,如果是 sxs 文件夹中完全缺少 Debug CRT 的错误。

在 64 位 Windows 7 上全新安装 VS2008 和包含 VC++ 项目的解决方案时,我遇到了这种情况。在运行时加载 C++ 程序集时,调试版本会崩溃,并出现并行错误。

在 Vista 和 Win7(但不是 XP)上,SxS 错误提供了有关它尝试加载但未能加载的确切程序集的详细信息 - 在本例中是 VC90.DebugCRT 9.0.22.19。我检查了 VC 程序集的(嵌入式)清单,果然,它包含对此程序集和版本的引用。

检查sxs目录(%System Drive%\Windows\WinSxS)发现根本没有VC90 DebugCRT并排安装!我已经安装了 VC++ 运行时,但这些不包括调试运行时。 VS2008 是用来安装调试运行时的,但是没有。

原来 VS2008 doesn't install 的原始版本是 64 位 VC++ DebugCRT,但安装 SP1 可以。完成此操作后,不再有运行时异常和并行错误。

【讨论】:

    【解决方案2】:
    1. 您可以使用Dependency Walker 找出您的程序试图查找的msvcr90d.dll 版本。可能是某个第 3 方组件链接到您没有的某个版本的 msvcr90d.dll。
    2. 您应该检查 manifest.xml 文件。尝试删除所有不必要的依赖项。

    【讨论】:

      【解决方案3】:

      以下是编译器的输出。奇怪的是第二次运行 build 成功了。但是我怀疑问题可能是由于运行 mt.exe 时出现的这个错误,它负责将清单中的信息嵌入到可执行文件中......

      Generating Code...
      link /LIBPATH:"c:\Qt\4.5.2-vc\lib" /NOLOGO /DEBUG /MANIFEST /MANIFESTFILE:"debug\formExtractor.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:debug\formExtractor.exe @.\nmD932.tmp
      mt.exe -nologo -manifest "debug\formExtractor.intermediate.manifest" -outputresource:debug\formExtractor.exe;1
      'mt.exe' is not recognized as an internal or external command,
      operable program or batch file.
      NMAKE : fatal error U1077: 'mt.exe' : return code '0x1'
      Stop.
      NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe"' : return code '0x2'
      Stop.
      Exited with code 2.
      

      更新

      在链接过程中未能运行 mt.exe 确实是问题的原因。我将 Windows SDK (C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin) 的路径添加到 PATH 环境变量中,现在我可以运行可执行文件了。

      对各种答案的评论;


      @谢伊

      sxstrace 的输出 txt 文件为空。不知道为什么。但是,应用程序日志中有以下信息:

      Faulting application formExtractor.exe, version 0.0.0.0, time stamp 0x4a638ee1, faulting module MSVCR90D.dll, version 6.0.6002.18005, time stamp 0x49e03824, exception code 0xc0000135, fault offset 0x0006f04e, process id 0xf68, application start time 0x01ca08ba801ac5cf.
      

      版本 6.0.6002.18005?
      这是什么鬼?


      @Kirill V. Lyadvinsky

      Dependency Walker 在
      c:\windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\MSVCR90D.DLL 中找到qtwebkit4.dll 文件使用的msvcr90d.dll

      但没有找到(其他版本的?)msvcr90d.dll 由可执行文件直接链接的文件。但是 DW 似乎并没有在任何地方显示它的版本,不是吗?

      formExtractor.intermediate.manifest 文件竞赛

      <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
      <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
          <security>
            <requestedPrivileges>
              <requestedExecutionLevel level='asInvoker' uiAccess='false' />
            </requestedPrivileges>
          </security>
        </trustInfo>
        <dependency>
          <dependentAssembly>
            <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*' />
          </dependentAssembly>
        </dependency>
        <dependency>
          <dependentAssembly>
            <assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
          </dependentAssembly>
        </dependency>
      </assembly>
      

      从清单文件看来,可执行文件链接到的msvcr90d.dll 版本与qtwebkit4.dll 不同。奇怪的是msvcr90d.dll 的两个版本都存在于以下子文件夹的c:\windows\winsxs 文件夹中
      x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb

      有什么想法吗?


      @knight666

      我正在使用 Qt 框架,它完全使用我现在使用的编译器编译,所以我认为这里没有不匹配。此外,Dependency Walker 显示缺少的 msvcr90d.dll 文件直接链接到可执行文件,因此我认为这不是任何第三方库的错误。

      【讨论】:

      • 尝试从清单中移除依赖Microsoft.VC90.DebugCRT
      • 将“C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin”添加到 PATH 也对我有用(Visual Studio 2008 Express,Windows 7 32 位)
      【解决方案4】:

      免责声明:我不是真正的 Win32 大师 :)

      我从未使用过 Qt Creator,但它是否为 exe 创建了正确的清单?
      也许清单适用于不同的版本(例如 SP1),而您只有 RTM 版本。
      你用的是Vista吗?您可以尝试运行SxsTrace 来诊断并行问题。

      【讨论】:

        【解决方案5】:

        更新:就我而言,我发现 vc++ 2008 express 有一个“使用 FAT32 解决方法”(在配置属性的“清单工具”页面中找到);这解决了问题。此选项的帮助信息说明 FAT32 驱动器/分区在时间戳中具有 2 秒的延迟,这会阻止 mt.exe 正常工作。这似乎可以解释问题的随机行为。

        【讨论】:

          【解决方案6】:

          您是否可能有版本不匹配?我对 Ogre 也有类似的情况,我必须使用最新版本的第三方库重新编译 SDK 才能编译。

          【讨论】:

            【解决方案7】:

            我对在 vs2008 c++ express ed 中找不到的 msvcr90d.dll 有同样的问题。 启用增量链接时,输出 .exe 中的嵌入式清单如下所示:



            汇编>

            难怪找不到msvcr90d.dll!

            我尝试了两件事:

            A.使用十六进制编辑器,上面的内容会被 ./Debug/XXX.embed.manifest 中的 内容覆盖

            B.使用 mt.exe -manifest ./Debug/XXX.embed.manifest -outputresource:./Debug/XXX.exe

            这两种方法似乎都有效。我使用第二种方法作为构建后事件命令:

            mt.exe -verbose -manifest ./$(ConfigurationName)/$(TargetFileName).embed.manifest -outputresource:./$(ConfigurationName)/$(TargetFileName)

            我不知道为什么在启用增量链接时将“错误”清单嵌入到第一个位置。如果有人知道原因,请发帖。

            谢谢!

            法度

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-12-08
              • 2015-01-13
              • 2016-04-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-05-24
              相关资源
              最近更新 更多