wake-up-neo.com

Schwerwiegender Fehler: "Keine Zielarchitektur" in Visual Studio

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 lauten 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 in dieses kopiert. Ich habe error : "No Target Architecture" nicht mehr, 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 eingegrenzt und festgestellt, dass es #include <WinDef.h> ist, der alle meine Kompilierungsfehler mit winnt.h verursacht, aber ich weiß immer noch nicht, wie ich es beheben kann.

73
philipvr

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

Von der windows.h wikipedia Seite:

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

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

121
philipvr

Eine andere Ursache kann das Einschließen eines Headers sein, der von windows.h abhängt, bevor windows.h eingefügt wird.

In meinem Fall habe ich xinput.h vor windows.h eingefügt und diese Fehlermeldung erhalten. Durch das Austauschen der Bestellung wurde das Problem gelöst.

14
Nathan Reed

_WIN32-ID ist nicht definiert.

verwenden Sie #include <SDKDDKVer.h>

Von MSVS generierte Projekte binden dieses Include um, indem ein lokaler "targetver.h" erzeugt wird, der von "stdafx.h" enthalten ist und in einen vorkompilierten Header über "stdafx.cpp" geschrieben wird.

EDIT: hast du eine/D "WIN32" in deiner Kommandozeile?

5
engf-010

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

4
David Heffernan

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

1
Brian

Ein weiterer Grund für den Fehler (unter vielen anderen, die beim Ändern des Ziel-Builds eines Win32-Projekts in X64 aufgetaucht sind) war, dass die C++ - 64-Bit-Compiler nicht installiert waren, wie oben auf dieser Seite angegeben. 
Abgesehen von philipvrs Kommentar zu Kindkopfzeilen (in meinem Fall) ein explizites Include von winnt.h, das unnötig ist, wenn windows.h verwendet wurde.

1
Laurie Stearn

Ich hatte ein ähnliches Problem. In meinem Fall hatte ich versehentlich winuser.h vor windows.h eingefügt (tatsächlich hatte eine fehlerhafte IDE Erweiterung es hinzugefügt). Durch das Entfernen des winuser.h wurde das Problem behoben. 

1
MxNx

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

UPDATE:
Ein weiterer Vorschlag ist, zu überprüfen, ob Sie ein "partielles Windows.h" einbinden. Ich meine, wenn Sie zum Beispiel winbase.h oder minwindef.h einbinden, können Sie diesen Fehler hinzufügen big "statt Windows.h. Es gibt auch einige weniger offensichtliche Fälle, die ich durchlaufen habe. Das Bemerkenswerteste war, dass ich nur synchapi.h eingebunden habe. In den Dokumenten wird klar angegeben, dass es sich um den Header handelt, der für einige Funktionen wie AcquireSRWLockShared einzubeziehen ist war es, die synchapi.h zu entfernen und "die großen" Windows.h einzuschließen. Windows.h ist umfangreich, es definiert Makros (viele von ihnen entfernen den Fehler "Kein Ziel-Arch") und enthalten viele andere Header. Zusammenfassend, überprüfen Sie immer, ob Sie einen Header einschließen, der könnte durch Windows.h ersetzt werden.

1
Melardev

Lösen Sie das Problem, 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>
1

Versuchen Sie am Anfang der Datei, bevor Sie eine include-Datei erstellen, eine dieser Zeilen

#define _X86_
#define _AMD64_
#define _ARM_

Wählen Sie je nach Architektur die geeignete, nur eine aus.

0
Andrea Araldo

https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects

sie müssen dieses Programm installieren, um dieses Problem zu beseitigen.... Nehmen Sie frischen Code, dann kompilieren Sie ...

0
Piyush Charan

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

#include <fileapi.h>

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

0
Shital Shah