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.
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.
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.
_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?
Es scheint, dass _AMD64_
nicht definiert ist, da ich mir nicht vorstellen kann, dass Sie für Itanium (_IA64_
) kompilieren.
Wenn Sie 32-Bit erstellen, stellen Sie sicher, dass Sie _WIN64 nicht für Ihr Projekt definiert haben.
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.
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.
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.
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>
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.
sie müssen dieses Programm installieren, um dieses Problem zu beseitigen.... Nehmen Sie frischen Code, dann kompilieren Sie ...
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.