解决在VS2019/2022中编译c++项目报错fatal error C1189: #error : “No Target Architecture”
报错原因
在winnt.h
中,不言而喻,一目了然:
代码节选:
#if defined(_AMD64_) || defined(_X86_)
#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
#elif defined(_IA64_) || defined(_ARM_) || defined(_ARM64_)//
// TODO: WOWXX - Unblock ARM. Make all alignment checks DWORD for now.
//#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
#elif !defined(RC_INVOKED)
#error "No Target Architecture"
#endif
可见,在winnt.h
的这段代码中,首先检测是否定义了_AMD64_
或_X86_
宏。若这两个宏均未定义,则进一步判断是否定义了_IA64_
、_ARM_
或_ARM64_
宏。这5个宏定义代表了5种cpu架构,也就是报错信息中的“Architecture”。如果这些宏都未被检测到,就会报错"No Target Architecture"
。
解决方法
方法一:添加关于平台的宏定义
在项目属性中添加宏定义,对应你的电脑cpu架构。目前大家使用的Windows系统中最流行的是AMD64位架构,也就是_AMD64_
,添加该定义即可。
方法二:正确地包含必要的头文件
在需要用到BYTE\BOOL
等Windows平台特有宏或函数的地方直接包含Windows.h
,尽量不要单独包含minwindef.h
、winnt.h
、fileapi.h
、winbase.h
、windef.h
等**非独立(not self-contained)**的头文件,例如不推荐:
#include<minwindef.h>
#include<windows.h>
推荐:
#include<windows.h>
即便要包含其他win-api相关头文件,也要放在#include<windows.h>
语句之后,如不推荐:
#include<minwindef.h>
#include<fileapi.h>
#include<Windows.h>
推荐:
#include<Windows.h>
#include<minwindef.h>
#include<fileapi.h>
有的用户不喜欢包含Windows.h
,认为它过于臃肿。那么可以在项目属性中添加宏定义WIN32_LEAN_AND_MEAN
来去掉不常用的头文件(包括cryptography、DDE、RPC、Windows Shell、Winsock等),加速Windows.h
的解析和后续编译过程。
扩展阅读
Windows.h中都有什么