我们有一个C++应用程序,我最近从Linux/gcc移植到Visual Studio 2005的Windows上构建。该应用程序使用仅提供使用优化的CRT DLL的DLL的第三方库(即它们不提供链接到调试CRT DLL的等价物)。对于VS2005来说,这似乎不成问题=调试版本在System32目录中找到优化的CRT DLL。调试构建应用程序定位发布CRT程序集
我现在试图用VS2008构建和运行我们的应用程序,并且调试版本无法运行,因为它找不到优化的CRT DLL(msvc690.dll)。 VC9 CRT DLLs在GUID风格名称的目录中被松动 - 我相信这是一个并排的程序集,应用程序应该使用应用程序的清单来定位它。但是,这种被建立并嵌入到应用程序exe文件清单仅指定调试CRT装配:
<?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.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
我不是一个Windows专家(没有任何更多,至少),所以这是所有新的给我。这里有什么正确的解决方案?我是否需要告诉清单编译器将优化的CRT DLL添加到程序集中?如果是这样,我该怎么做?
Doh,我的意思是msvcr90.dll。 Tha第三方DLL不包含它自己的清单。如果我在Dep Walker中打开它,它对msvcr80.dll有依赖性。经过一些进一步的调查,我认为这个第三方lib是一个红鲱鱼。看来我们的一个库正在链接到调试和优化的CRT DLL。它恰好是依赖于第三方库的lib,因此可能仍然是原因,但我必须仔细检查项目设置才能确定。无论如何,感谢您的帮助,我可能会回来更多的问题。 – 2009-08-20 11:44:49
我不得不在调试配置的项目设置中明确排除MSVCRT.lib,然后这一切似乎工作。我会将这个答案标记为正确,因为它似乎正确回答了我原来的问题。 – 2009-08-20 15:13:37
除非第三方“dll”实际上是静态库,否则我必须承认解决方案没有多大意义。如果他们是dll,他们应该对他们想要的哪个运行时DLL相当坚持。因为第三方dll已经链接,所以更改应用程序链接器设置不应该改变这一点。 – 2009-08-20 15:33:53