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


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.


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.


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


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_).


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


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>

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.


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.


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.


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 .


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.