Schwerwiegender Fehler: "Keine Zielarchitektur" in Visual Studio

96

Wenn ich versuche, mein C ++ - Projekt mit Visual Studio 2010 im Win32- oder x64-Modus zu kompilieren, wird die folgende Fehlermeldung angezeigt:

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

Meine Präprozessordefinitionen sagen WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)

Was verursacht diesen Fehler und wie behebe ich ihn?

// 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

Update: Ich habe ein neues msvs-Projekt erstellt und meinen Code darauf kopiert. Ich habe keine mehr error : "No Target Architecture", aber jetzt habe ich eine Reihe von Kompilierungsfehlern mit winnt.h und winbase.h und keine Kompilierungsfehler mit einer meiner Dateien. Ist es möglich, dass diese Dateien beschädigt sind? Muss ich MSVS 2010 neu installieren?

Update 2: Also habe ich mein Problem #include <WinDef.h>eingegrenzt und festgestellt, dass es alle meine Kompilierungsfehler mit winnt.h verursacht, aber ich weiß immer noch nicht, wie ich es beheben soll.

philipvr
quelle
Wie lege ich die Zielarchitektur für mein Projekt fest?
Philipvr
Ein Vanille-Projekt scheitert auf diese Weise nicht. Was haben Sie von einem Vanilleprojekt geändert? Was steht in Zeile 135 von winnt.h? Haben Sie sich sogar diese Zeile der Header-Datei angesehen? Die Fehlermeldung gibt Ihnen Hilfe.
David Heffernan
Sie sollten es von hier aus herausfinden können; Wahrscheinlich müssen Sie jedoch vor Zeile 127 zurückgehen, um das vollständige Bild zu erhalten. Es scheint klar zu sein, dass Edwin Recht hatte.
David Heffernan
Probieren Sie ein neues msvs-Projekt (Dummy) aus und ziehen Sie Ihre Quellen kopiert hinein. Versuchen Sie es zu kompilieren und vergleichen Sie es gegebenenfalls mit Ihrem ursprünglichen Projekt. Übrigens kopieren Sie die stdafx nicht. *
engf-010
Hört sich schlecht an. Bevor Sie jedoch eine Neuinstallation durchführen, können Sie diese zunächst mit einer neuen Lösung ausprobieren. Wenn dies nicht funktioniert, können Sie project = templates (google it) manuell neu installieren.
engf-010

Antworten:

146

Verwenden Sie #include <windows.h>anstelle von #include <windef.h>.

Von der windows.hWikipedia-Seite:

Es gibt eine Reihe von untergeordneten Header-Dateien, die automatisch in enthalten sind windows.h. Viele dieser Dateien können aufgrund von Abhängigkeiten nicht einfach selbst eingeschlossen werden (sie sind nicht in sich geschlossen ).

windef.hist eine der Dateien, die automatisch in enthalten sind windows.h.

philipvr
quelle
Ich habe daran gedacht, aber ich konnte mir nicht vorstellen, dass Sie windows.h nicht enthalten.
engf-010
1
windows.h definiert alkinds anderer Definitionen basierend auf Compiler-Switches und enthält viele WINAPI-Header, von denen einige von den von windows.h definierten Dingen abhängen.
engf-010
Herzlichen Glückwunsch, Sie haben Ihr Problem behoben und haben genug Repräsentanten, um abzustimmen!
David Heffernan
1
Weder windows.h noch windowsx.h (ich gehe davon aus, dass sie dasselbe sind, aber trotzdem beide ausprobiert haben) helfen dabei #error Hey man you gotta choose a target.. Was könnte das noch beheben?
Rsethc
Heads up: scheint Xinput.h einzuschließen, bevor Windows.h dies ebenfalls verursacht.
Jens Åkerblom
24

Eine andere Ursache hierfür kann das Einfügen eines Headers sein windows.h, der vor dem Einschließen davon abhängt windows.h.

In meinem Fall habe ich xinput.hvorher aufgenommen windows.hund diesen Fehler bekommen. Das Austauschen der Bestellung löste das Problem.

Nathan Reed
quelle
4
Genau meine Lösung! Danke, dass du mir Stunden der Frustration erspart hast.
Acidic9
5

_WIN32-ID ist nicht definiert.

verwenden #include <SDKDDKVer.h>

MSVS erzeugt Projekte wickeln diese enthalten , indem eine lokale Erzeugung "targetver.h"der durch eingeschlossen ist , "stdafx.h"dass sich in eine vorkompilierte comiled-Header durch "stdafx.cpp".

EDIT: Haben Sie ein / D "WIN32" in Ihrer Kommandozeile?

engf-010
quelle
Sollte es _WIN32eher sein als WIN32? Es ist nicht mein Fachgebiet, aber angesichts der _WIN64Tatsache , dass der Header nach '_AMD64_` usw. sucht , erscheint es plausibel.
David Heffernan
@ David Heffernan: In der Kommandozeile steht WIN32 (no _) auch für x84. Ich kenne die
Gründe
4
@ Edwin x84? Ist das George Orwells Computer?
David Heffernan
@ David Heffernan: Ja, der große Bruder beobachtet mich! (offensichtlich x64 meinte ich)
engf-010
In meinem Fall wurde _WIN32 definiert und war der Schuldige. Ich habe für x64 gebaut. Ihre Antwort hat mich auf den richtigen Weg gebracht. Gut gemacht!
Herve Mutombo
4

Es scheint, dass dies _AMD64_nicht definiert ist, da ich mir nicht vorstellen kann, dass Sie für Itanium ( _IA64_) kompilieren .

David Heffernan
quelle
AMD64 wird unter bestimmten Bedingungen definiert: #if! Defined ( 68K ) &&! Defined ( MPPC ) &&! Defined ( X86 ) &&! Defined ( IA64 ) &&! Defined ( AMD64 ) && defined (_M_AMD64)
engf-010
@Edwin Wenn _AMD64_oder _IA64_definiert wurde, würde er den Fehler nicht erhalten. Das steht in der Header-Datei.
David Heffernan
philipvr hat seinen Beitrag aktualisiert. Er hat andere (mehr) Probleme. Er denkt daran, MSVS neu zu installieren.
engf-010
3

Lösen Sie es, indem Sie die folgenden Include-Dateien und Definitionen zuerst platzieren:

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

#include <windows.h>
Michael Haephrati
quelle
Dies hat sowohl meine x86- als auch meine x64-Builds behoben. Ich musste diese Zeilen vorher hinzufügen #include <WinUser.h>.
Jonathan Lidbeck
2

Wenn Sie Resharper verwenden, stellen Sie sicher, dass nicht der falsche Header für Sie hinzugefügt wird. Sehr häufige Fälle bei ReSharper sind:
- #include <consoleapi2.h
-#include <apiquery2.h>

UPDATE :
Ein weiterer Vorschlag ist, zu überprüfen, ob Sie eine "teilweise Windows.h" einschließen. Ich meine, wenn Sie beispielsweise winbase.h oder minwindef.h einschließen, kann dies zu einem Fehler führen, und stattdessen "the big" hinzufügen Windows.h. Es gibt auch einige weniger offensichtliche Fälle, die ich durchlaufen habe. Am bemerkenswertesten war, dass ich nur synchapi.h eingefügt habe. In den Dokumenten wird eindeutig angegeben, dass dies der Header ist, der für einige Funktionen wie AcquireSRWLockShared enthalten sein soll, aber es wurde die No-Target-Architektur, das Update, ausgelöst war die synchapi.h zu entfernen und "die große" Windows.h einzuschließen. Die Windows.h-Datei ist riesig, sie definiert Makros (viele von ihnen entfernen den Fehler "Kein Zielbogen") und enthält viele andere Header. Überprüfen Sie zusammenfassend immer, ob Sie einen Header einfügen, der durch Windows ersetzt werden könnte.

Melardev
quelle
1

Ein weiterer Grund für den Fehler (unter anderem, der beim Ändern des Ziel-Builds eines Win32-Projekts auf X64 auftrat) war, dass die C ++ 64-Bit-Compiler nicht wie oben auf dieser Seite angegeben installiert waren .
Weiter philipvr Kommentar über Kinder Header, (in meinem Fall) eine explizite sind von winnt.h ist nicht notwendig , wenn windows.h verwendet wurde.

Laurie Stearn
quelle
Ein weiterer Besuch auf dieser Seite erfolgte, als ein altes Projekt zufällig "#include <synchapi.h>" in einem CriticalSection-Header hatte.
Laurie Stearn
1

Ich hatte ein ähnliches Problem. In meinem Fall hatte ich versehentlich eingeschlossen winuser.hvor windows.h(eigentlich eine Buggy IDE Erweiterung hinzugefügt hatte). Entfernen des winuser.hgelösten Problems.

MxNx
quelle
1
Für mich hat ReSharper hinzugefügtconsoleapi2.h
SWdV
1

Neben den bereits beschriebenen Ursachen habe ich diesen Fehler erhalten, weil ich Folgendes einschließen würde:

#include <fileapi.h>

Anscheinend wurde es nicht benötigt (trotz des Aufrufs von CreateDirectoryW). Nach dem Auskommentieren war der Compiler glücklich. Sehr eigenartig.

Shital Shah
quelle
1

includeVersuchen Sie am Anfang der Datei, die Sie kompilieren, bevor Sie eine dieser Zeilen einfügen

#define _X86_
#define _AMD64_
#define _ARM_

Wählen Sie je nach Architektur nur die entsprechende aus.

Andrea Araldo
quelle
0

Wenn Sie 32-Bit erstellen, stellen Sie sicher, dass für Ihr Projekt nicht _WIN64 definiert ist.

Brian
quelle