1

我有一个使用 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 但这没有帮助。

4

1 回答 1

3

版本由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 to 1 为您提供所需的版本字符串。

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

其他故障排除可从 Project + Properties、C/C++、Advanced、Show Includes = Yes 获得。您将在“输出”窗口中看到所有#include 文件的跟踪。

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

于 2012-04-21T14:26:06.170 回答