我有一个使用Visual Studio 2010创建的C ++ / CLI项目,该项目面向.NET Framework 3.5和PlatformToolset v90。最初它请求版本9.0.21022.8的VC CRT,但是如果我包含atlbase.h头,那么它请求VC CRT版本9.0.30729.6161。 为什么会这样?如何在不包含atlbase.h的情况下将其定位到9.0.30729.6161?
我尝试定义宏_BIND_TO_CURRENT_CRT_VERSION = 1和_BIND_TO_CURRENT_VCLIBS_VERSION = 1,但这没有帮助。
答案 0 :(得分: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显式覆盖该版本。不要那样做。正如您在问题中所述,#define _BIND_TO_CURRENT_CRT_VERSION为1可以获得您想要的版本字符串。
在C ++ / CLI项目中遇到此问题是可能的。您可以在不包含任何CRT包含文件的情况下编译C ++ / CLI代码。因此,你最终会得到一个默认版本,具有讽刺意味的是,链接器默认为其自己的CRT版本。因此,解决方法是将#include <crtassem.h>
明确地放在您的一个源代码文件中。 #include atlbase.h也会这样做,因为它 包含CRT标题,但当然是大锤方法。
Project + Properties,C / C ++,Advanced,Show Includes = Yes提供了其他疑难解答。您将看到所有#include文件的痕迹都包含在“输出”窗口中。
请注意,您现在要承担额外的负担,以确保在用户的计算机上部署最新版本的msvcr90.dll。如果程序丢失或过时,您的程序将无法启动。