【问题标题】:atlbase.h and different versions of VC CRTatlbase.h 和不同版本的 VC CRT
【发布时间】:2012-05-02 18:48:53
【问题描述】:

我有一个使用 Visual Studio 2010 创建的 C++/CLI 项目,该项目面向 .NET Framework 3.5 和 PlatformToolset v90。最初它请求版本 9.0.21022.8 的 VC CRT,但如果我包含 atlbase.h 标头,则它请求版本 9.0.30729.6161 的 VC CRT。 为什么会这样?以及如何在不包含 atlbase.h 的情况下使其目标 9.0.30729.6161?

我尝试定义宏 _BIND_TO_CURRENT_CRT_VERSION=1 和 _BIND_TO_CURRENT_VCLIBS_VERSION=1 但这没有帮助。

【问题讨论】:

  • 如果您使用 C++/CLI,为什么还需要 ATL?要么做 COM(并使用 ATL,和普通的 C++),要么做 .NET。不要两者都做,这是自找麻烦。
  • 我不需要 ATL,我需要目标 9.0.30729.6161。但我只能通过包含 atlbase.h 来实现这一点。所以问题是我怎样才能摆脱 atlbase.h 但仍以 9.0.30729.6161 为目标?
  • 你必须安装VS2008才能做目标V9.0。确保您拥有 VS2008 的 SP1。卸载+重新安装所有东西应该可以解决它(我从来没有遇到过这样的问题)。如果您不想为 2 个许可证付费,它可以与 VC++2008 express 一起使用。
  • 我确实有带有 SP1 的 VS2008。很抱歉没有提到这一点。

标签: c++ c++-cli atl crt


【解决方案1】:

版本由vc/include/crtassem.h设置,靠近底部可以看到:

#ifndef _CRT_ASSEMBLY_VERSION
#if _BIND_TO_CURRENT_CRT_VERSION
#define _CRT_ASSEMBLY_VERSION "9.0.30729.6161"
#else
#define _CRT_ASSEMBLY_VERSION "9.0.21022.8"
#endif
#endif

所以规则是您可以通过#defining _CRT_ASSEMBLY_VERSION 显式覆盖版本。不要那样做。正如您在问题中指出的那样,#defining _BIND_TO_CURRENT_CRT_VERSION 为 1 可以获得您想要的版本字符串。

在 C++/CLI 项目中可能会遇到此问题。您可以编译 C++/CLI 代码,而无需 #include 任何 CRT 包含文件。因此,您最终会得到一个默认版本,具有讽刺意味的是,链接器 将其默认为它自己的 CRT 版本。因此,一种解决方法是将#include <crtassem.h> 显式放入您的一个源代码文件中。 #include atlbase.h 也会这样做,因为它确实包含 CRT 标头,但当然是大锤方法。

其他故障排除可从项目 + 属性、C/C++、高级、显示包含 = 是。您将在“输出”窗口中看到所有#include 文件的跟踪。

请注意,您现在将有额外的负担来确保将最新版本的 msvcr90.dll 部署在用户的计算机上。如果缺少或旧的程序将无法启动。

【讨论】:

  • 非常感谢您的解释。我的应用程序使用 CRT 作为私有程序集,始终为 9.0.30729.6161 版本。鉴于这是否是明确#define _CRT_ASSEMBLY_VERSION "9.0.30729.6161" 的正确方法?
  • crtassem.h 文件以及(希望)您在开发机器上使用的 DLL 的任何副本都可以通过安全补丁进行更新。这已经发生了几次。这就是您最终在副本中得到 .6161 的方式。所以不,#defining it yourself 不是一个好主意,安全补丁不会更新它。
猜你喜欢
  • 2011-01-05
  • 1970-01-01
  • 2012-02-21
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
相关资源
最近更新 更多