3

我正在为 C++ 使用 Visual Studio 2008。编译时,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 的开销。

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

4

4 回答 4

2

包含在二进制文件中的清单是由 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 部署以避免这种情况。

于 2010-02-23T16:21:11.770 回答
1

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

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

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

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

于 2010-02-23T15:48:45.840 回答
1

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

于 2010-02-23T15:46:36.310 回答
0

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

我们不得不在以前的工作地点这样做,不幸的是(或者也许,更幸运的是),我没有接触到它是如何完成的深入细节。这篇文章看起来最接近我们在这个主题上能找到的。

更新0

这是有关清单文件生成的 MSDN 文档,以及它们在隔离应用程序和构建并行程序集中的用途。

于 2010-02-23T16:02:00.270 回答