Kiedy próbuję skompilować projekt C ++ przy użyciu programu Visual Studio 2010 w trybie Win32 lub x64, pojawia się następujący błąd:
>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(135): fatal error C1189: #error : "No Target Architecture"
Moje definicje preprocesora mówią WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)
Co powoduje ten błąd i jak go naprawić?
// 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
Aktualizacja: utworzyłem nowy projekt msvs i skopiowałem do niego mój kod. Już nie mam error : "No Target Architecture"
, ale teraz mam kilka błędów kompilacji związanych z winnt.h i winbase.h oraz żadnych błędów kompilacji dotyczących żadnego z moich plików. Czy to możliwe, że te pliki są uszkodzone? Czy muszę ponownie zainstalować MSVS 2010?
Aktualizacja 2: Więc zawęziłem mój problem i stwierdziłem, że jest #include <WinDef.h>
to przyczyną wszystkich moich błędów kompilacji w winnt.h, ale nadal nie wiem, jak to naprawić.
źródło
Odpowiedzi:
Użyj
#include <windows.h>
zamiast#include <windef.h>
.Ze strony
windows.h
wikipedii:windef.h
jest jednym z plików automatycznie dołączanych dowindows.h
.źródło
#error Hey man you gotta choose a target.
. Co jeszcze mogłoby to naprawić?Inną przyczyną może być dołączenie nagłówka, od którego zależy
windows.h
, przed dołączeniemwindows.h
.W moim przypadku dołączyłem
xinput.h
wcześniejwindows.h
i otrzymałem ten błąd. Zmiana kolejności rozwiązała problem.źródło
Identyfikator _WIN32 nie jest zdefiniowany.
posługiwać się
#include <SDKDDKVer.h>
Projekty generowane przez MSVS zawijają to dołączenie, generując lokalny,
"targetver.h"
który jest dołączany do"stdafx.h"
tego, który jest kompilowany do prekompilowanego-nagłówka za pośrednictwem"stdafx.cpp"
.EDYCJA: czy masz / D "WIN32" w linii poleceń?
źródło
_WIN32
raczej niżWIN32
? To nie jest mój obszar specjalizacji, ale biorąc pod uwagę, że nagłówek szuka_WIN64
„_AMD64_” itp., Wydaje się to prawdopodobne.Wydawałoby się, że
_AMD64_
nie jest to zdefiniowane, ponieważ nie wyobrażam sobie, że kompilujesz dla Itanium (_IA64_
).źródło
_AMD64_
lub_IA64_
został zdefiniowany, nie wystąpiłby błąd. Tak mówi plik nagłówkowy.Jeśli używasz Resharper, upewnij się, że nie dodaje on niewłaściwego nagłówka, bardzo częste przypadki z ReSharper to:
#include <consoleapi2.h
#include <apiquery2.h>
#include <fileapi.h>
AKTUALIZACJA :
Inną sugestią jest sprawdzenie, czy dołączasz „częściowy plik Windows.h”, mam na myśli to, że jeśli dołączasz na przykład winbase.h lub minwindef.h, możesz skończyć z tym błędem, dodaj „duży” Windows .h zamiast. Istnieją również mniej oczywiste przypadki, przez które przeszedłem, najbardziej godne uwagi było to, gdy dołączyłem tylko synchapi.h, dokumenty jasno określają, że jest to nagłówek, który ma być dołączony do niektórych funkcji, takich jak AcquireSRWLockShared, ale uruchomił architekturę Brak docelowej, poprawka polegało na usunięciu pliku synchapi.h i dołączeniu „dużego” systemu Windows.h.
Windows.h jest ogromny, definiuje makra (wiele z nich usuwa błąd No target arch) i zawiera wiele innych nagłówków. Podsumowując , zawsze sprawdź, czy dołączasz jakiś nagłówek, który mógłby zostać zastąpiony przez Windows.h, ponieważ nie jest niczym niezwykłym dołączanie nagłówka, który opiera się na niektórych stałych, które są zdefiniowane przez Windows.h, więc jeśli nie dołączysz tego nagłówka, kompilacja może się nie powieść.
źródło
Rozwiąż ten problem, umieszczając najpierw następujące pliki dołączania i definicję:
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h>
źródło
#include <WinUser.h>
.Miałem podobny problem. W moim przypadku przypadkowo włączyłem
winuser.h
wcześniejwindows.h
(w rzeczywistości dodało go błędne rozszerzenie IDE). Usunięciewinuser.h
rozwiązanego problemu.źródło
consoleapi2.h
Poza opisanymi już przyczynami otrzymałem ten błąd, ponieważ podałbym:
#include <fileapi.h>
Najwyraźniej nie było to potrzebne (pomimo wywołania CreateDirectoryW). Po skomentowaniu kompilator był zadowolony. Bardzo dziwny.
źródło
Na początku kompilowanego pliku, przed jakimkolwiek
include
, spróbuj umieścić JEDEN z tych wierszy#define _X86_ #define _AMD64_ #define _ARM_
Wybierz odpowiedni, tylko jeden, w zależności od architektury.
źródło
Innym powodem błędu (wśród wielu innych, które pojawiły się podczas zmiany docelowej kompilacji projektu Win32 na X64) był brak zainstalowanych kompilatorów C ++ 64-bitowych, jak wspomniano na górze tej strony .
W nawiązaniu do komentarza philipvr dotyczącego nagłówków potomnych (w moim przypadku) wyraźne dołączenie winnt.h jest niepotrzebne, gdy używany był windows.h .
źródło
Jeśli tworzysz wersję 32-bitową, upewnij się, że nie masz zdefiniowanego _WIN64 dla swojego projektu.
źródło