解决在VS2019/2022中编译c++项目报错fatal error C1189: #error : “No Target Architecture“

解决在VS2019/2022中编译c++项目报错fatal error C1189: #error : “No Target Architecture”

报错原因

winnt.h中,不言而喻,一目了然:
解决在VS2019/2022中编译c++项目报错fatal error C1189: #error : “No Target Architecture“_第1张图片
代码节选:

#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
#include

推荐:

#include

即便要包含其他win-api相关头文件,也要放在#include语句之后,如不推荐:

#include
#include
#include

推荐:

#include
#include
#include

有的用户不喜欢包含Windows.h,认为它过于臃肿。那么可以在项目属性中添加宏定义WIN32_LEAN_AND_MEAN来去掉不常用的头文件(包括cryptography、DDE、RPC、Windows Shell、Winsock等),加速Windows.h的解析和后续编译过程。

扩展阅读

Windows.h中都有什么

你可能感兴趣的:(Windows问题解决,MSVC,c/c++,开发语言,windows,c语言)