版本由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 部署在用户的计算机上。如果您的程序丢失或陈旧,您的程序将无法启动。