【问题标题】:How to select against which version of the Visual C++ libraries the application is compiled?如何选择编译应用程序的 Visual C++ 库版本?
【发布时间】:2011-01-20 03:03:54
【问题描述】:

我正在使用 Visual Studio 2008 for C++。编译时,Visual Studio 会针对 VC 9.0 库的头文件进行编译。然而,这个库有不同的版本可用:

  • v9.0.21022.8 (= RTM)
  • v9.0.30729.17 (= SP1)
  • v9.0.30729.4148(= 带有安全更新的 SP1)

我想知道是否可以告诉 Visual Studio 它应该针对哪个版本进行编译。

我认为这很重要的原因是应用程序的安装程序需要确保安装了正确版本的 Microsoft Visual C++ 2008 Redistributable Package。对我来说,感觉就像我无法控制这种依赖关系,因为显然某些 Windows 更新(不是 Visual Studio 更新)可以改变这种依赖关系。我想继续使用相同的版本,以避免安装程序升级 Redistributable Package 的开销。

注意,这种情况与我的earlier question 不同,因为那是关于链接时间的。我也不是在寻找一种方法来控制嵌入清单文件中的版本,正如here 所解释的那样。

【问题讨论】:

    标签: c++ visual-studio-2008 dependencies libraries


    【解决方案1】:

    二进制文件中包含的清单是由 VS 构建系统自动生成的。确定发出到清单中的版本依赖关系的重要标头是 vc\include\crtassem.h 和 crtdefs.h。前者声明了 CRT 版本。请注意,它已经支持 RTM 版本与带有 _BIND_TO_CURRENT_CRT_VERSION 宏的“最新”版本。后者包含 #pragma 注释指令,用于将 /manifestdependency 链接器选项嵌入到 .obj 文件中,从而使链接器自动生成清单。

    您不必这样做,您可以简单地关闭生成清单的链接器选项并编写您自己的。这使您可以完全控制您的应用绑定到的 CRT 版本。你是否领先这有点值得怀疑。您可能仍在运送去年 7 月更新的旧版 CRT,它包含一个严重的安全漏洞。客户往往对在他们的机器上安装的软件有很好的记录并解决了安全漏洞有点不高兴。


    接下来您必须控制 DLL 的部署。您必须自己将 DLL 部署到 WinSxS 并行缓存中。

    如果你知道怎么做,它会起作用,但它不太可能存活很长时间。如果启用 Windows 更新,可能会发现计算机正在使用未打补丁的 DLL 版本并将对其进行更新。并部署发布者策略来重定向加载请求。如果您看到清单版本请求导致加载另一个版本,则您的计算机可能有这样的策略文件。有点不可避免的结论是,这是 MSFT 的 DLL,他们会用它来做他们认为必要的事情。查看 applocal 部署以避免这种情况。

    【讨论】:

    • 感谢您的回答。我已经发现了 _BIND_TO_CURRENT_CRT_VERSION 标志。遗憾的是,这仅选择要在清单文件中生成的版本号,而且据我从实验中得出的结论,这个数字只不过是文档。例如,在公共并行汇编案例中运行 .exe 时,将使用系统上安装的库的最新版本,无论清单文件中说明了什么。我感兴趣的是控制 .DLL 的预期版本,即相关头文件的版本。
    【解决方案2】:

    这只是您的配置要针对哪个目录构建的问题。只要您的机器上有所有版本的标头以及它们链接的库,我不明白为什么这不能成为每个版本的新配置。

    【讨论】:

      【解决方案3】:

      如果问题是 SP1 之类的问题,您无能为力。 Microsoft 认为运行时实际上是操作系统的一个组件。因此,它获得与任何操作系统组件相同的更新和补丁。

      这不应该有问题,通常 - 补丁毕竟是错误修复和安全更新。原则上,每次更改都应该使您的应用程序更加稳定。并非总是如此,但无论如何您无能为力。

      有更改运行时的选项,但它们与线程安全和类似问题有关。项目属性中有几个相关的地方。特别是,在 C/C++/Code Generation 选项卡中,您可以选择使用哪个运行时库。

      如果您非常担心,可以选择静态链接的非 DLL 运行时。用户仍然可以更新他们的运行时 DLL,但这样做不会提高您应用的稳定性。

      【讨论】:

        【解决方案4】:

        您可以使用以 XML 编写的清单资源文件来执行此操作。

        不幸的是(或者也许更幸运的是),我们不得不在以前的工作地点做这件事,我没有接触到它是如何做的详细细节。 This article 看起来与我在该主题上所能找到的最接近。

        更新0

        这里是关于 manifest file generation 的 MSDN 文档,以及它们在 isolating applications and building side by side assemblies 中的使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-12
          • 2011-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多