【问题标题】:Debug Build App locating Release CRT Assemblies调试构建应用程序定位发布 CRT 程序集
【发布时间】:2010-11-21 06:18:10
【问题描述】:

我们有一个 c++ 应用程序,我最近从 Linux/gcc 移植到使用 Visual Studio 2005 在 Windows 上构建。该应用程序使用第 3 方库,该库仅提供使用优化 CRT DLL 的 DLL(即它们不提供等价物哪个链接到调试 CRT DLL)。对于 VS2005,这似乎不是问题 = 调试版本在 System32 目录中找到了优化的 CRT DLL。

我现在正在尝试使用 VS2008 构建和运行我们的应用程序,但调试构建无法运行,因为它找不到优化的 CRT DLL (msvc690.dll)。 VC9 CRT DLL 被隐藏在具有 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 添加到程序集中吗?如果是这样,我该怎么做?

【问题讨论】:

    标签: windows visual-studio-2008 assemblies manifest side-by-side


    【解决方案1】:

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

    如果有,或者即使没有,获取DependencyWalker 以查看该第三方库试图链接到的确切运行时 dll 也很有用。

    它与 VS2005 而不是 VS2008 一起工作的事实意味着 dll 希望使用 VS2005 运行时的 releasemode 版本:msvcr80.dll

    您提到了 msvc690.dll,它并没有引起我的注意:Visual Studio 6 使用了简单命名的 msvcrt.dll - 第一个使用版本化 dll 运行时的 Visual Studio 版本是 VS 2003 .NET 或其他东西: msvcrt7.dll

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

    有很多方法可以做到这一点 - 您可以将清单片段创建为 XML 文件并将其添加到您的应用程序“配置属性 > 清单工具 > 输入和输出 > 附加清单文件”

    我发现在 VS2008 中合并额外的依赖汇编指令最方便的方法是使用链接器 /manifestdependency 命令行选项。

    如果您将以下代码 sn-p 添加到项目中的文件中,它将为链接器提供必要的提示:

    #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 库的版本号或公钥令牌。如果您可以查找并填写它们,它应该会顺利进行。

    【讨论】:

    • Doh,我的意思是 msvcr90.dll。 Tha 3rd 方 DLL 不包含它自己的清单。如果我在 Dep Walker 中打开它,它依赖于 msvcr80.dll。经过进一步调查,我认为这个第 3 方库是一个红鲱鱼。看来我们的一个库正在链接到调试和优化的 CRT DLL。它恰好是依赖于 3rd 方库的库,因此这可能仍然是原因,但我必须仔细检查项目设置才能确定。无论如何感谢您的帮助,我可能会带着更多问题回来。
    • 我不得不在项目设置中明确排除 MSVCRT.lib 以进行调试配置,然后一切似乎都可以正常工作。我会将此答案标记为正确,因为它确实正确回答了我的原始问题。
    • 除非第 3 方“dll”实际上是静态库,否则我必须承认该解决方案没有多大意义。如果他们是 dll,他们应该坚持他们想要哪个运行时 dll。更改您的应用程序链接器设置不应更改,因为第 3 方 dll 已链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多