我有一个使用 Visual Studio 2010 创建的 C++/CLI 项目,它面向 .NET Framework 3.5 和 PlatformToolset v90。最初它请求版本 9.0.21022.8 的 VC CRT,但如果我包含 atlbase.h header ,那么它请求版本 9.0.30729.6161 的 VC CRT。 为什么会这样?以及如何在不包含 atlbase.h 的情况下使其成为目标 9.0.30729.6161?
我尝试定义宏 _BIND_TO_CURRENT_CRT_VERSION=1 和 _BIND_TO_CURRENT_VCLIBS_VERSION=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 代码而无需 #including 任何 CRT 包含文件。所以你最终会得到一个默认版本,具有讽刺意味的是,它被链接器默认为它自己的 CRT 版本。所以一个解决方法是明确地把 #include <crtassem.h>
在您的一个源代码文件中。 #including atlbase.h 也会这样做,因为它确实包含 CRT header ,但当然是大锤方法。
可通过项目 + 属性、C/C++、高级、显示包含 = 进行其他故障排除。您会在输出窗口中看到所有 #include 文件的踪迹。
请注意,您现在将承担额外的负担,以确保在用户计算机上部署最新版本的 msvcr90.dll。如果程序丢失或过旧,您的程序将无法启动。
关于c++ - atlbase.h和不同版本的VC CRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258848/