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.
quelle
Antworten:
Verwenden Sie
#include <windows.h>
anstelle von#include <windef.h>
.Von der
windows.h
Wikipedia-Seite:windef.h
ist eine der Dateien, die automatisch in enthalten sindwindows.h
.quelle
#error Hey man you gotta choose a target.
. Was könnte das noch beheben?Eine andere Ursache hierfür kann das Einfügen eines Headers sein
windows.h
, der vor dem Einschließen davon abhängtwindows.h
.In meinem Fall habe ich
xinput.h
vorher aufgenommenwindows.h
und diesen Fehler bekommen. Das Austauschen der Bestellung löste das Problem.quelle
_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?
quelle
_WIN32
eher sein alsWIN32
? Es ist nicht mein Fachgebiet, aber angesichts der_WIN64
Tatsache , dass der Header nach '_AMD64_` usw. sucht , erscheint es plausibel.Es scheint, dass dies
_AMD64_
nicht definiert ist, da ich mir nicht vorstellen kann, dass Sie für Itanium (_IA64_
) kompilieren .quelle
_AMD64_
oder_IA64_
definiert wurde, würde er den Fehler nicht erhalten. Das steht in der Header-Datei.Lösen Sie es, indem Sie die folgenden Include-Dateien und Definitionen zuerst platzieren:
quelle
#include <WinUser.h>
.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.
quelle
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.
quelle
Ich hatte ein ähnliches Problem. In meinem Fall hatte ich versehentlich eingeschlossen
winuser.h
vorwindows.h
(eigentlich eine Buggy IDE Erweiterung hinzugefügt hatte). Entfernen deswinuser.h
gelösten Problems.quelle
consoleapi2.h
Neben den bereits beschriebenen Ursachen habe ich diesen Fehler erhalten, weil ich Folgendes einschließen würde:
Anscheinend wurde es nicht benötigt (trotz des Aufrufs von CreateDirectoryW). Nach dem Auskommentieren war der Compiler glücklich. Sehr eigenartig.
quelle
include
Versuchen Sie am Anfang der Datei, die Sie kompilieren, bevor Sie eine dieser Zeilen einfügenWählen Sie je nach Architektur nur die entsprechende aus.
quelle
Wenn Sie 32-Bit erstellen, stellen Sie sicher, dass für Ihr Projekt nicht _WIN64 definiert ist.
quelle