【问题标题】:Fatal error: "No Target Architecture" in Visual Studio致命错误:Visual Studio 中的“无目标体系结构”
【发布时间】:2011-06-18 05:28:38
【问题描述】:

当我尝试在 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 中的所有编译错误,但我仍然不知道如何解决它。

【问题讨论】:

  • 如何为我的项目设置目标架构?
  • 普通项目不会以这种方式失败。你从一个普通的项目中改变了什么? winnt.h 的第 135 行是什么?你有没有看过头文件的那一行。错误消息为您提供了一些帮助。
  • 你应该可以从这里解决它;可能需要在第 127 行之前返回才能获得全貌。埃德温似乎是正确的。
  • 尝试一个新的 msvs 项目(虚拟)并将您的源代码复制拖放到其中。尝试编译它,如果可以,将其与您的原始项目进行比较。顺便说一句,不要复制 stdafx。*
  • 听起来很糟糕。但是在重新安装之前,您可以先尝试使用新的解决方案,如果这不起作用,您可以手动重新安装 project=templates (google it)。

标签: c++ windows visual-studio visual-c++ compiler-errors


【解决方案1】:

_WIN32 标识符未定义。

使用#include <SDKDDKVer.h>

MSVS 生成的项目通过生成本地 "targetver.h" 来包装此包含,该本地 "targetver.h" 包含在 "stdafx.h" 中,并通过 "stdafx.cpp" 编译到预编译头中。

编辑:你的命令行上有 /D "WIN32" 吗?

【讨论】:

  • 应该是_WIN32 而不是WIN32?这不是我的专业领域,但鉴于标题正在寻找 _WIN64、'_AMD64_` 等,这似乎是合理的。
  • @David Heffernan :在命令行中,即使对于 x84,它也会显示 WIN32(没有 _)。不知道它的基本原理(但谁了解 MS)
  • @Edwin x84?那是乔治奥威尔的电脑吗?
  • @David Heffernan:是的,大哥在看着我! (显然我的意思是 x64)
  • 在我的例子中 _WIN32 被定义并且是罪魁祸首。我正在为 x64 构建。你的回答让我走上了正轨。干得好!
【解决方案2】:

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

【讨论】:

  • AMD64 将在某些条件下定义:#if !defined(68K) && !defined(MPPC) && !defined(X86) && !defined(IA64) && !defined(AMD64) && defined(_M_AMD64)
  • @Edwin 如果定义了_AMD64__IA64_,那么他就不会收到错误消息。这就是头文件所说的。
  • philipvr 更新了他的帖子。他还有其他(更多)问题。他正在考虑重新安装 MSVS。
【解决方案3】:

使用#include <windows.h> 而不是#include <windef.h>

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

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

windef.h 是自动包含在windows.h 中的文件之一。

【讨论】:

  • 我确实想过,但我无法想象您没有包含 windows.h。
  • windows.h 定义了各种基于编译器开关的其他定义,包括许多 WINAPI 头文件,其中一些取决于 windows.h 定义的内容。
  • 恭喜,您已解决问题并且您有足够的代表投票!
  • windows.h 和 windowsx.h 都不是(我认为它们是同一件事,但无论如何都尝试过)帮助#error Hey man you gotta choose a target.。还有什么可以解决的?
  • 如果我包含 Windows.h,我会被告知我不能包含它两次。为什么它不忽略第二个包含?
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • 正是我的解决方案!感谢您为我节省了数小时的挫败感。
    【解决方案6】:

    该错误的另一个原因(在将 Win32 项目的目标构建更改为 X64 时出现的许多其他原因中)是没有安装 C++ 64 位编译器,如 this page 顶部所述。
    除了 philipvr 对子标题的评论之外,(在我的情况下)当使用 windows.h 时,winnt.h 的显式包含为 unnecessary

    【讨论】:

    • 当旧项目碰巧在 CriticalSection 标头中有 `#include ` 时,再次访问此页面。
    【解决方案7】:

    我遇到了类似的问题。就我而言,我不小心在windows.h 之前包含了winuser.h(实际上,添加了一个错误的IDE 扩展)。删除winuser.h 解决了这个问题。

    【讨论】:

    • 为我添加 ReSharper consoleapi2.h
    【解决方案8】:

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

    #include <fileapi.h>
    

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

    【讨论】:

    • 我的情况完全一样。
    【解决方案9】:

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

    #define _X86_
    #define _AMD64_
    #define _ARM_
    

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

    【讨论】:

      【解决方案10】:

      通过首先放置以下包含文件和定义来解决它:

      #define WIN32_LEAN_AND_MEAN      // Exclude rarely-used stuff from Windows headers
      
      #include <windows.h>
      

      【讨论】:

      • 这修复了我的 x86 和 x64 版本。我需要在#include &lt;WinUser.h&gt; 之前添加这些行。
      【解决方案11】:

      如果您使用的是 Resharper,请确保它不会为您添加错误的标头,ReSharper 的常见情况是:

      • #include &lt;consoleapi2.h
      • #include &lt;apiquery2.h&gt;
      • #include &lt;fileapi.h&gt;

      更新
      另一个建议是检查您是否包含“部分 Windows.h”,我的意思是,如果您包含例如 winbase.h 或 minwindef.h,您可能最终会出现该错误,请添加“大”Windows.h反而。我还经历了一些不太明显的情况,最值得注意的是当我只包含 synchapi.h 时,文档明确指出这是某些功能(如 AcquireSRWLockShared)要包含的标头,但它触发了无目标架构,修复是删除 synchapi.h 并包含“大”Windows.h。

      Windows.h 很大,它定义了宏(其中许多删除了 No target arch 错误)并包含许多其他头文件。 总而言之,请始终检查您是否包含一些 可以被 Windows.h 替换的标头,因为包含依赖于某些已定义常量的标头并不罕见由 Windows.h 提供,因此如果您未能包含此标头,您的编译可能会失败。

      【讨论】:

      • 谢谢。我包括windows.h 来替换WinBase.hfileapi.h
      猜你喜欢
      • 2019-05-02
      • 2020-04-03
      • 2017-11-11
      • 2018-10-21
      • 1970-01-01
      • 2013-12-15
      • 2015-09-11
      • 1970-01-01
      相关资源
      最近更新 更多