11

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

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

任何人?

4

7 回答 7

11

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

在 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 的原始版本 没有安装64 位 VC++ DebugCRT,但安装了 SP1。完成此操作后,不再有运行时异常和并行错误。

于 2010-08-05T06:53:59.133 回答
6
  1. 您可以使用Dependency Walker找出您的程序试图查找的 msvcr90d.dll 版本。可能是一些第三方组件链接到您没有的某些版本的 msvcr90d.dll。
  2. 您应该检查 manifest.xml 文件。尝试删除所有不必要的依赖项。
于 2009-07-19T18:47:08.930 回答
4

下面是编译器的输出。奇怪的是第二次运行 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 环境变量中,现在我可以运行可执行文件了。

对各种答案的评论;


@Shay

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 发现文件msvcr90d.dll使用的qtwebkit4.dll
c:\windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\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_96748342450f6aa2 ,并且 x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb

有任何想法吗?


@knight666

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

于 2009-07-19T20:08:37.767 回答
3

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

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

于 2009-07-19T18:08:42.067 回答
3

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

于 2009-08-05T14:11:20.290 回答
1

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

于 2009-07-19T20:02:54.190 回答
1

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

<?xml version="1.0" encoding="UTF-8" Standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
</assembly>

难怪找不到msvcr90d.dll!

我尝试了两件事:

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

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

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

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

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

谢谢!

于 2009-08-04T22:23:59.887 回答