代码之家  ›  专栏  ›  技术社区  ›  jon hanson

调试生成应用程序定位发布CRT程序集

  •  0
  • jon hanson  · 技术社区  · 16 年前

    我们有一个C++应用程序,最近我从Linux /GCC移植到Visual Studio 2005上的Windows上。该应用程序使用第三方库,该库仅提供使用优化CRT DLL的DLL(即,它们不提供链接到调试CRT DLL的等效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专家(至少不再是了),所以这对我来说是全新的。这里的正确解决方案是什么?我是否需要告诉清单编译器将优化的CRT DLL添加到程序集?如果是这样,我该怎么做?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Chris Becke    16 年前

    好啊如果在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

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

    有多种方法可以做到这一点-您可以将清单碎片创建为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库的版本号或公钥令牌。如果你能查一查并填上,应该会很顺利。