0

我们有一个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添加到程序集中?如果是这样,我该怎么做?

回答

1

好的。如果你在VS 2008中打开第三方库dll(确保它选择了OpenWith> Resource Editor)它是否包含它自己的清单?

如果确实存在,或者即使不存在,也可以通过DependencyWalker查看此第三方库试图链接到哪个确切的运行时DLL。

它与VS2005的工作,而不是VS2008,意味着该dll想要使用VS2005运行时的releasemode版本的事实:MSVCR80.DLL

你提到msvc690.dll,不按门铃与我:Visual Studio 6使用简单命名为msvcrt.dll - 第一版本的Visual Studio使用版本化的DLL运行时是VS 2003 NET或什么:msvcrt7.dll

无论如何,如果第三方库不包含自己的清单资源,那么最简单的做法是将相关程序集引用添加到应用程序清单。

有许多这样做的方法 - 你可以创建一个清单fragement作为一个XML文件,并将其添加到您的应用程序“配置属性>清单工具>输入和输出>其他清单文件”

我找到在VS2008中合并附加的依赖程序集指令的最方便的方法是使用linkers/manifestdependency命令行选项。

如果添加以下代码片段在你的项目中的文件,它会给链接必要的提示:

#define X_CRT_ASSEMBLY_VERSION "9.0.21022.8" 
#pragma comment(linker,"/manifestdependency:\"type='win32' "\ 
    "name='"Microsoft.VC80.CRT' " 
    "version='8.0.??.??' "       \ 
    "processorArchitecture='x86' "         \ 
    "publicKeyToken='????????'\"") 

的??的是那里,因为我不知道的版本号或VS2005库的公钥密码。如果你能看到它们并填充它们,它应该游泳。

+0

Doh,我的意思是msvcr90.dll。 Tha第三方DLL不包含它自己的清单。如果我在Dep Walker中打开它,它对msvcr80.dll有依赖性。经过一些进一步的调查,我认为这个第三方lib是一个红鲱鱼。看来我们的一个库正在链接到调试和优化的CRT DLL。它恰好是依赖于第三方库的lib,因此可能仍然是原因,但我必须仔细检查项目设置才能确定。无论如何,感谢您的帮助,我可能会回来更多的问题。 – 2009-08-20 11:44:49

+0

我不得不在调试配置的项目设置中明确排除MSVCRT.lib,然后这一切似乎工作。我会将这个答案标记为正确,因为它似乎正确回答了我原来的问题。 – 2009-08-20 15:13:37

+0

除非第三方“dll”实际上是静态库,否则我必须承认解决方案没有多大意义。如果他们是dll,他们应该对他们想要的哪个运行时DLL相当坚持。因为第三方dll已经链接,所以更改应用程序链接器设置不应该改变这一点。 – 2009-08-20 15:33:53