Błąd krytyczny: „Brak architektury docelowej” w programie Visual Studio

100

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ć.

philipvr
źródło
Jak ustawić architekturę docelową dla mojego projektu?
philipvr
Projekt waniliowy nie zawodzi w ten sposób. Co zmieniłeś od projektu waniliowego? Co znajduje się w linii 135 pliku winnt.h? Czy spojrzałeś nawet na tę linię pliku nagłówkowego. Komunikat o błędzie zawiera pomoc.
David Heffernan
powinieneś być w stanie rozwiązać to stąd; prawdopodobnie trzeba będzie jednak cofnąć się przed linią 127, aby uzyskać pełny obraz. Wydawałoby się jasne, że Edwin miał rację.
David Heffernan
Wypróbuj nowy projekt msvs (fikcyjny) i skopiuj-przeciągnij do niego swoje źródła. Spróbuj go skompilować, a jeśli tak, porównaj z oryginalnym projektem. BTW nie kopiuj stdafx. *
engf-010
Brzmi źle. Ale zanim wykonasz ponowną instalację, możesz najpierw wypróbować to z nowym rozwiązaniem, a jeśli to nie zadziała, możesz ręcznie ponownie zainstalować project = templates (google it).
engf-010

Odpowiedzi:

154

Użyj #include <windows.h>zamiast #include <windef.h>.

Ze strony windows.hwikipedii:

Istnieje wiele podrzędnych plików nagłówkowych, które są automatycznie dołączane do windows.h. Wiele z tych plików nie może być po prostu dołączonych samodzielnie (nie są one samodzielne ) z powodu zależności.

windef.hjest jednym z plików automatycznie dołączanych do windows.h.

philipvr
źródło
Myślałem o tym, ale nie mogłem sobie wyobrazić, że nie zawierałeś windows.h.
engf-010
1
windows.h definiuje alkindów innych definicji w oparciu o przełączniki kompilatora i zawiera wiele nagłówków WINAPI, z których niektóre zależą od elementów określonych przez windows.h.
engf-010
gratulacje, rozwiązałeś problem i masz wystarczającą liczbę przedstawicieli, aby zagłosować!
David Heffernan
1
Ani windows.h, ani windowsx.h (zakładam, że są tym samym, ale i tak próbowałem obu) nie pomagają w tym #error Hey man you gotta choose a target.. Co jeszcze mogłoby to naprawić?
rsethc
Uwaga: wydaje się, że zawiera Xinput.h przed Windows.h powoduje to również.
Jens Åkerblom
26

Inną przyczyną może być dołączenie nagłówka, od którego zależy windows.h, przed dołączeniem windows.h.

W moim przypadku dołączyłem xinput.hwcześniej windows.hi otrzymałem ten błąd. Zmiana kolejności rozwiązała problem.

Nathan Reed
źródło
5
Dokładnie moje rozwiązanie! Dzięki za zaoszczędzenie mi wielu godzin frustracji.
Acidic9
5

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ń?

engf-010
źródło
Powinien być _WIN32raczej 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.
David Heffernan
@David Heffernan: w wierszu poleceń mówi WIN32 (no _) nawet dla x84. Nie znam powodu (ale kto rozumie stwardnienie rozsiane)
engf-010
4
@Edwin x84? Czy to komputer George'a Orwella?
David Heffernan
@David Heffernan: tak, wielki brat mnie obserwuje! (oczywiście x64
miałem na
W moim przypadku _WIN32 został zdefiniowany i był winowajcą. Budowałem dla x64. Twoja odpowiedź postawiła mnie na właściwej drodze. Dobra robota!
Herve Mutombo
4

Wydawałoby się, że _AMD64_nie jest to zdefiniowane, ponieważ nie wyobrażam sobie, że kompilujesz dla Itanium ( _IA64_).

David Heffernan
źródło
AMD64 zostanie zdefiniowane pod pewnymi warunkami: #if! Zdefiniowano ( 68K ) &&! Zdefiniowano ( MPPC ) &&! Zdefiniowano ( X86 ) &&! Zdefiniowano ( IA64 ) &&! Zdefiniowano ( AMD64 ) && zdefiniowano (_M_AMD64)
engf-010
@Edwin Gdyby _AMD64_lub _IA64_został zdefiniowany, nie wystąpiłby błąd. Tak mówi plik nagłówkowy.
David Heffernan
philipvr zaktualizował swój post. Ma inne (więcej) problemy. On myśli o ponownym zainstalowaniu MSVS.
engf-010
4

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ść.

Melardev
źródło
3

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>
Michael Haephrati
źródło
To naprawiło zarówno moje kompilacje x86, jak i x64. Musiałem wcześniej dodać te linie #include <WinUser.h>.
Jonathan Lidbeck
2

Miałem podobny problem. W moim przypadku przypadkowo włączyłem winuser.hwcześniej windows.h(w rzeczywistości dodało go błędne rozszerzenie IDE). Usunięcie winuser.hrozwiązanego problemu.

MxNx
źródło
1
Dla mnie dodano consoleapi2.h
ReSharper
2

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.

Shital Shah
źródło
Mam dokładnie taką samą sytuację.
JOE
2

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.

Andrea Araldo
źródło
1

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 .

Laurie Stearn
źródło
Kolejna wizyta na tej stronie miała miejsce, gdy zdarzyło się, że stary projekt miał `#include <synchapi.h>` w nagłówku CriticalSection.
Laurie Stearn,
0

Jeśli tworzysz wersję 32-bitową, upewnij się, że nie masz zdefiniowanego _WIN64 dla swojego projektu.

Brian
źródło