我发现了MSVCR90D.dll not found in debug mode with Visual C++ 2008个问题,但没有一个给出的答案真正回答了这个问题。其中大多数都指向关闭增量链接,但没有解释错误的真正原因以及如何修复没有关闭增量链接。
我想提一下我的情况与原问题中的情况略有不同。我正在使用Visual Studio 2008中的C ++编译器,但在Qt Creator中不在Visual Studio中。
任何?
答案 0 :(得分:11)
如果在sxs文件夹中完全没有调试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 doesn't install是一个64位的VC ++ DebugCRT,但是安装了SP1。一旦我完成了这个,就不再有运行时异常和并排错误。
答案 1 :(得分:6)
答案 2 :(得分:4)
以下是编译器的输出。第二次运行构建成功很奇怪。但是我怀疑问题可能是由于运行mt.exe时出现此错误,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 file
的比赛<?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
文件直接链接 到可执行文件,所以这不是我认为的任何第三方库的错误。
答案 3 :(得分:3)
免责声明:我不是真正的一个Win32主人:)
我从未使用过Qt Creator,但它是否为exe创建了一个合适的清单? 也许清单是针对不同的版本(例如SP1),而您只有RTM版本 你在使用Vista吗?您可以尝试运行SxsTrace来诊断并排问题。
答案 4 :(得分:3)
更新:在我的情况下,我发现vc ++ 2008 express有一个'使用FAT32解决'(在配置属性'“清单工具”页面中找到);这解决了这个问题。此选项的帮助信息说明FAT32驱动器/分区在时间戳中有2秒的延迟,阻止mt.exe正常工作。这似乎解释了问题的某种随机行为。
答案 5 :(得分:1)
您的版本可能不匹配吗?我和Ogre有类似的东西,我不得不使用最新版本的第三方库重新编译SDK以便编译。
答案 6 :(得分:1)
我在vs2008 c ++ express ed中找不到msvcr90d.dll也有同样的问题。 当启用增量链接时,输出.exe中的嵌入式清单如下所示:
&lt;?xml version =“1.0”encoding =“UTF-8”standalone =“yes”?&gt;
&lt; assembly manifestVersion =“1.0”xmlns =“urn:schemas-microsoft-com:asm.v1”&gt;
&LT; /组装&GT;
难怪无法找到msvcr90d.dll!
我尝试了两件事:一个。使用十六进制编辑器,上面的内容将被&lt; assembly&gt;覆盖。内容见./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)
我不知道为什么在启用增量链接时,第一个位置会嵌入'错误'清单。如果有人知道原因,请发帖。
谢谢!
法