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

C++ atlbase.h和不同版本的VC CRT,c++,c++-cli,atl,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头,那么它请求版本9.0.30729.6161的VC CRT。 为什么会发生这种情况?在不包括atlbase.h的情况下,如何实现目标9.0.30729.6161 我试图定义宏“绑定到当前”CRT“版本=1和“绑定到当前”VCLIBS“版本=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


我试图定义宏“绑定到当前”CRT“版本=1和“绑定到当前”VCLIBS“版本=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
因此,规则是,您可以通过#定义#CRT_汇编(u version)显式覆盖该版本。不要那样做。正如您在问题中所指出的,将#绑定#到#当前#CRT#版本定义为1可以获得所需的版本字符串

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

其他疑难解答可从Project+Properties、C/C++、Advanced、Show Includes=Yes获得。您将看到输出窗口中包含的所有#include文件的跟踪


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

如果您使用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。卸载+重新安装一切都可以修复它(我从来没有遇到过这样的问题)。它与VC++2008 express配合使用,以防您不想为2个许可证付费。我有带SP1的VS2008。很抱歉没提那件事。非常感谢你的解释。我的应用程序使用CRT作为私有程序集,该程序集的版本始终为9.0.30729.6161。考虑到这一点,明确定义CRT汇编版本“9.0.30729.6161”是正确的方法吗?crtassem.h文件以及(希望)您在开发机器上使用的DLL的任何副本都可以通过安全补丁进行更新。这已经发生过好几次了。这就是为什么你的副本中有.6161。因此,不,自己定义它不是一个好主意,安全补丁不会更新它。