致命错误: VisualStudio 中的“无目标体系结构”

当我尝试使用 Visual Studio 2010在 Win32或 x64模式下编译 c + + 项目时,会得到以下错误:

>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(135): fatal error C1189: #error : "No Target Architecture"

我的预处理器定义是 WIN32; _ DEBUG; _ CONSOLE;% (PreprocessorDefinition)

是什么导致了这个错误,我如何修复它?

// winnt.h: lines 127-136, MSVS says this is an inactive preprocessor block
#if defined(_WIN64)


#if defined(_AMD64_)
#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
#elif defined(_IA64_)
#define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( _s ) > TYPE_ALIGNMENT( DWORD ) ? \
TYPE_ALIGNMENT( _s ) : TYPE_ALIGNMENT( DWORD ))
#else
#error "No Target Architecture"
#endif

更新: 我创建了一个新的 msvs 项目,并将我的代码复制到其中。我不再使用 error : "No Target Architecture",但是现在我有一大堆涉及 winnt.h 和 winbase.h 的编译错误,而且没有涉及我的任何文件的编译错误。有没有可能这些文件已经损坏了?我需要重新安装 MSVS2010吗?

更新2: 我缩小了问题的范围,发现是 #include <WinDef.h>导致了 winnt.h 的所有编译错误,但是我仍然不知道如何修复它。

146852 次浏览

_ WIN32标识符未定义。

使用 #include <SDKDDKVer.h>

MSVS 生成的项目通过生成 "stdafx.h"包含的本地 "targetver.h"来包装这些内容,该 "stdafx.h"通过 "stdafx.cpp"被编译成预编译头文件。

编辑: 你的命令行上有 a/D“ WIN32”吗?

似乎没有定义 _AMD64_,因为我无法想象您正在编译 Itanium (_IA64_)。

使用 #include <windows.h>代替 #include <windef.h>

来自 windows.h维基百科页面:

windows.h自动包含许多子头文件。由于依赖关系,这些文件中的许多文件不能简单地自己包含(它们不是 自给自足)。

windef.hwindows.h自动包含的文件之一。

如果您正在构建32位,那么请确保您没有为您的项目定义 _ WIN64。

造成这种情况的另一个原因是,在包含 windows.h之前,可以包含一个依赖于 windows.h的头。

在我的例子中,我在 windows.h之前加入了 xinput.h,得到了这个错误。交换顺序解决了这个问题。

这个错误的另一个原因(在将 Win32项目的目标构建改为 X64时出现的许多其他错误中)是没有像在 这一页顶部那样安装 C + + 64位编译器。
除了 philipvr 关于子头的注释之外,(在我的例子中)在使用 窗户时明确包含 Winnt.h没必要

我也有过类似的问题。在我的例子中,我不小心在 windows.h之前包含了 winuser.h(实际上,是一个有缺陷的 IDE 扩展添加了它)。删除 winuser.h解决了这个问题。

除了已经描述的原因之外,我还收到了这个错误,因为我将包括:

#include <fileapi.h>

显然,它不是必需的(尽管 CreateDirectoryW 调用)。注释了之后,编译器很高兴。非常奇怪。

在你正在编译的文件的开头,在任何 include之前,尝试放置这些行中的一行

#define _X86_
#define _AMD64_
#define _ARM_

根据您的架构选择合适的,只有一个。

解决方法是首先放置以下包含文件和定义:

#define WIN32_LEAN_AND_MEAN      // Exclude rarely-used stuff from Windows headers


#include <windows.h>

如果你正在使用 ReSharper,请确保它没有为你添加错误的头部,ReSharper 的常见情况是:

  • #include <consoleapi2.h
  • #include <apiquery2.h>
  • #include <fileapi.h>

更新 :
另一个建议是检查你是否包含了“部分 Windows.h”,我的意思是如果你包含了例如 winbase.h 或 minwindef.h,你可能会得到这个错误,添加“大的”Windows.h 代替。我也经历过一些不太明显的情况,最值得注意的是当我只包含 synchapi.h 的时候,文档清楚地说明这是一些函数(比如 AcquireSRWLockShared)的头部,但是它触发了 No 目标架构,修复的方法是删除 synchapi.h 并包含“ the big”Windows.h。

H 非常庞大,它定义了宏(许多宏删除了 No target arch 错误)并包含了许多其他的头。总结一下,始终检查你是否包含了某个头 可以被 Windows.h 取代,因为包含一个依赖于 Windows.h 定义的常量的头并不罕见,所以如果你没有包含这个头你的编译可能会失败。

如果您希望避免显式地包含特定的 WindowsSDK 头文件,那么应该采用下面的方法:

#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
#define _AMD64_
#elif defined(i386) || defined(__i386) || defined(__i386__) || defined(__i386__) || defined(_M_IX86)
#define _X86_
#elif defined(__arm__) || defined(_M_ARM) || defined(_M_ARMT)
#define _ARM_
#endif

Windows 10x64 pro build 19044.1586

我的案子是按照.h 文件顺序排列的

好像这不管用似的

#include <processthreadsapi.h>
#include <iostream>
#include <windows.h>

但工作原理是这样的

#include <windows.h>
#include <iostream>
#include <processthreadsapi.h>

对我来说,我使用的是 glfw 和 imgui,我错误地包含了这个头文件:

#include <stringapiset.h>

我只是删除它和这个错误不再