致命错误:Visual Studio中出现“无目标体系结构”


96

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

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

我的预处理器定义说WIN32; _DEBUG; _CONSOLE;%(PreprocessorDefinitions)

是什么导致此错误,我该如何解决?

// 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的编译错误,而没有涉及我任何文件的编译错误。这些文件是否可能已损坏?我需要重新安装MSVS 2010吗?

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


如何为我的项目设置目标架构?
philipvr 2011年

香草项目不会以这种方式失败。您从香草项目中得到了什么改变?winnt.h的第135行是什么?您甚至没有看过头文件的那一行。该错误信息为您提供了一些帮助。
David Heffernan'1

您应该可以从这里解决问题;可能需要回到第127行之前才能获得完整图像。看来埃德温是正确的。
David Heffernan'1

尝试一个新的msvs项目(虚拟),并将您的源代码复制并拖入其中。尝试编译它,如果可以,请将其与原始项目进行比较。BTW请勿复制stdafx。*
engf-010 2011年

听起来不好。但是,在进行重新安装之前,您首先可以尝试使用新的解决方案,如果该方法不起作用,则可以手动重新安装project = templates(使用Google搜索)。
engf-010 2011年

Answers:


146

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

windows.h维基百科页面:

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

windef.hwindows.h。随附的文件之一。


我确实想到了这一点,但是我无法想象您没有包含windows.h。
engf-010 2011年

1
windows.h基于编译器开关定义其他定义的alkind,并包含许多WINAPI标头,其中一些取决于windows.h定义的内容。
engf-010 2011年

恭喜,您已解决问题,并且有足够的代表投票!
David Heffernan'1

1
Windows.h都不是Windowsx.h(我假设它们是同一件事,但无论如何都尝试过)都没有帮助#error Hey man you gotta choose a target.。还有什么可以解决这个问题?
rsethc 2014年

抬头:似乎在Windows.h引起Xinput.h之前也是如此。
詹斯·阿克布洛姆(JensÅkerblom),2013年

24

造成这种情况的另一个原因可能是windows.h在包含之前包含了一个取决于的标头windows.h

以我为例,我xinput.h之前加入过windows.h该错误。交换订单解决了问题。


4
正是我的解决方案!感谢您为我节省了数小时的挫败感。
Acidic9年

5

_WIN32标识符未定义。

#include <SDKDDKVer.h>

MSVS生成的项目对此进行了包装"targetver.h",方法是生成一个包含在其中的本地文件,该本地"stdafx.h"文件通过编译为一个预编译头文件"stdafx.cpp"

编辑:您的命令行上是否有一个/ D“ WIN32”?


应该_WIN32而不是WIN32?这不是我的专业领域,但是考虑到标题正在寻找_WIN64'_AMD64_`等,这似乎是合理的。
David Heffernan '01

@David Heffernan:在命令行中,即使对于x84,它也显示WIN32(否_)。不知道它的原理(但谁确实了解MS)
engf-010 2011年

4
@爱德温x84?那是乔治·奥威尔的电脑吗?
David Heffernan'1

@David Heffernan:是的,大哥在看着我!(显然是我指的是x64)
engf-010 2011年

在我的情况下,_WIN32已被定义为罪魁祸首。我正在为x64构建。您的回答使我步入正轨。做得好!
Herve Mutombo '18

4

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


将在以下条件下定义AMD64:#if!defined(68K)&&!defined(MPPC)&&!defined(X86)&&!defined(IA64)&&!defined(AMD64)&& define(_M_AMD64)
engf-010

@Edwin如果_AMD64_或被_IA64_定义,那么他就不会出错。那就是头文件所说的。
David Heffernan'1

philipvr更新了他的帖子。他还有其他(更多)问题。他正在考虑重新安装MSVS。
engf-010 2011年



2

如果您使用ReSharper的确保它不会加错头的你,与ReSharper的很常见的情况是:
- #include <consoleapi2.h
-#include <apiquery2.h>

更新
另一个建议是检查是否包含“部分Windows.h”,我的意思是,如果包含例如winbase.h或minwindef.h,则可能会出现该错误,请添加“ the big” Windows.h。我还经历了一些不太明显的情况,最值得注意的是当我仅包含synchapi.h时,文档明确指出这是某些功能(如AcquireSRWLockShared)要包含的标头,但它触发了No target体系结构,修复程序是要删除synchapi.h并包含“大型” Windows.h。Windows.h是hughe,它定义了宏(其中许多消除了No target arch错误)并包含许多其他头文件。总而言之,请始终检查是否包含一些可以由Windows替换的标头


1

错误的另一个原因(在将Win32项目的目标内部版本更改为X64时出现的很多错误中)没有安装如本页顶部所述的C ++ 64位编译器。
除了philipvr对子标头的评论之外(在我的情况下),当使用windows.h时,不需要显式包含winnt.h


当一个旧项目的CriticalSection标头中恰好有`#include <synchapi.h>时,再次访问该页面。
Laurie Stearn '18

1

我有一个类似的问题。就我而言,我不小心包括winuser.h之前windows.h(实际上,一个有错误的IDE扩展已添加的话)。删除已winuser.h解决的问题。


1
对我来说ReSharper添加了consoleapi2.h
SWdV '18年

1

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

#include <fileapi.h>

显然不需要(尽管有CreateDirectoryW调用)。注释掉后,编译器很高兴。很奇怪。


0

如果要构建32bit,请确保没有为项目定义_WIN64。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.