c++ - atlbase.h和不同版本的VC CRT

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

我有一个使用 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/

相关文章:

c++ cli 时间跨度格式不起作用

c++ - VERIFY 和 ATLVERIFY 有什么区别

C++ 用更多元素重写浮点 vector

c++ - 如何使用 C++ 从字符串中删除前导零?

c++ cli try block 不允许文件流打开大文件

c++ - CComBSTR::AssignBSTR() 的可能返回值是什么?

c++ - 如果将 COM 接口(interface)的指针分配给 CComPtr 对象,我是否需要释放原始接口(interface)?

c++ - 覆盖原始数据类型的转换

arrays - 将数组初始化为固定长度数组的最佳方法是什么? (C++/CLI)

c# - 带有 std::string 的 PInvoke 自定义编码(marshal)拆收器