我们有一个c ++应用程序,我最近从Linux / gcc移植到使用Visual Studio 2005在Windows上构建。该应用程序使用第三方库,它只提供使用优化CRT DLL的DLL(即它们不提供等价物)哪个链接到调试CRT DLL)。使用VS2005这似乎不是问题=调试版本在System32目录中找到了优化的CRT DLL。
我现在正在尝试使用VS2008构建和运行我们的应用程序,并且调试版本无法运行,因为它无法找到优化的CRT DLL(msvc690.dll)。 VC9 CRT DLL在具有GUID样式名称的目录中被剔除 - 我相信这是一个并排的程序集,应用程序应该使用应用程序的清单找到它。但是,在app 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专家(至少不再是Windows专家),所以这对我来说都是新手。这里有什么正确的解决方案?我是否需要告诉清单编译器将优化的CRT DLL添加到程序集中?如果是这样,我该怎么做?
答案 0 :(得分:1)
确定。如果你在VS 2008中打开第三方库dll(确保它选择OpenWith&gt;资源编辑器)它是否包含它自己的清单?
如果确实如此,或者即使它没有,它也可以让DependencyWalker看到这个第三方库试图链接到哪个确切的运行时dll。
它与VS2005一起工作,而不是VS2008,这意味着dll想要使用VS2005运行时的releasemode版本:msvcr80.dll
你提到msvc690.dll,它不响铃我:Visual Studio 6使用简单命名的msvcrt.dll - 使用版本化dll运行时的第一个版本的Visual Studio是VS 2003 .NET或者其他东西: msvcrt7.dll
无论如何,如果第三方库不包含自己的清单资源,那么最简单的方法是将依赖程序集引用添加到应用程序清单。
有很多方法可以做到这一点 - 你可以创建一个清单fragement作为XML文件并将其添加到你的应用程序“Configuration Properties&gt; Manifest Tool&gt; Input and Output&gt; Additional Manifest Files”
我发现在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库的版本号或公钥令牌。如果你可以查看它们并填写它们,它应该是游泳的。