версия устанавливаются ВМ/включить/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, не включив ни один из включенных в CRT файлов. Таким образом, вы получите версию по умолчанию, которая, по иронии судьбы, по умолчанию используется компоновщиком для собственной версии CRT. Поэтому обходным путем является явно помещать #include <crtassem.h>
в один из файлов исходного кода. #including atlbase.h сделал бы это тоже, так как это делает включают заголовки CRT, но, конечно, большой подход молотка.
Дополнительное устранение неполадок доступно в Project + Properties, C/C++, Advanced, Show Includes = Yes. В окне вывода вы увидите след всех файлов #include.
Опасайтесь, что теперь у вас будет дополнительная нагрузка для обеспечения того, чтобы обновленная версия msvcr90.dll была развернута на компьютере пользователя. Ваша программа не запустится, если она отсутствует или устарела.
Почему вам нужен ATL, если вы используете C++/CLI? Либо выполните COM (и используйте ATL, и обычный C++), либо .NET. Не делайте обоих, это требует неприятностей. –
Мне не нужен ATL, мне нужна цель 9.0.30729.6161. Но я могу сделать это, только включив atlbase.h. Итак, вопрос в том, как я могу избавиться от atlbase.h, но все же нацелился на 9.0.30729.6161? – vkrzv
У вас должен быть установлен VS2008 для достижения цели V9.0. Убедитесь, что у вас есть SP1 для VS2008. Удаление + переустановка все должно исправить (у меня никогда не было таких проблем). Он работает с VC++ 2008 Express, если вы не хотите платить за 2 лицензии. –