解决在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.hwinnt.hfileapi.hwinbase.hwindef.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中都有什么

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐