59

Quando provo a compilare il mio progetto C++ utilizzando Visual Studio 2010 in modalità Win32 o x64 ottengo il seguente errore:Fatal error: "No Obiettivo Architettura" in Visual Studio

>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(135): fatal error C1189: #error : "No Target Architecture"

mie definizioni del preprocessore dire WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)

Che cosa sta provocando questo errore e come lo risolvo?

// 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 

Aggiornamento: ho creato un nuovo progetto msvs e copiato il mio codice su di esso. Non ho più error : "No Target Architecture", ma ora ho un sacco di errori di compilazione che coinvolgono winnt.h e winbase.h e nessun errore di compilazione che coinvolge nessuno dei miei file. È possibile che questi file siano corrotti? Devo reinstallare MSVS 2010?

Aggiornamento 2: Così ho ristretto il mio problema e ho scoperto che è #include <WinDef.h> che causa tutti i miei errori di compilazione con winnt.h ma non so ancora come risolverlo.

+0

Come si imposta l'architettura di destinazione per il mio progetto? – philipvr

+0

Un progetto vanilla non fallisce in questo modo. Cosa sei cambiato da un progetto vanilla? Cosa c'è alla riga 135 di winnt.h? Hai persino guardato quella riga del file di intestazione. Il messaggio di errore ti sta aiutando. –

+0

dovresti essere in grado di risolverlo da qui; probabilmente è necessario tornare indietro prima della riga 127 per ottenere il quadro completo. Sembrerebbe chiaro che Edwin aveva ragione. –

risposta

100

Utilizzare #include <windows.h> anziché #include <windef.h>.

Dalla pagina windows.h wikipedia:

There are a number of child header files that are automatically included with windows.h . Many of these files cannot simply be included by themselves (they are not self-contained), because of dependencies.

windef.h è uno dei file inclusi automaticamente con windows.h.

+0

Ci ho pensato, ma non ho potuto immaginare che non includessi windows.h. –

+1

windows.h definisce alkinds di altre definizioni basate sui commutatori-switch e include molte intestazioni WINAPI, alcune delle quali dipendono da cose defnite da windows.h. –

+0

congratulazioni, hai risolto il problema ** e ** hai abbastanza rep per votare! –

4

_ L'identificativo WIN32 non è definito.

uso #include <SDKDDKVer.h>

MSVS generato progetti avvolgono questo includono generando un locale "targetver.h" che è incluso per "stdafx.h" che è comiled in un precompilata-header attraverso "stdafx.cpp".

MODIFICA: è presente una/D "WIN32" sulla riga di comando?

+0

Ho già '#include ' nel mio 'targetver.h' – philipvr

+0

il tuo commento è stato più veloce della mia modifica. –

+0

Sì, ho '/ D" WIN32 "' nelle mie opzioni della riga di comando. – philipvr

2

Sembrerebbe che _AMD64_ non sia definito, poiché non riesco a immaginare di compilare per Itanium (_IA64_).

+0

_AMD64_ verrà definito in alcune condizioni: #if! definito (_68K_) &&! definito (_MPPC_) &&! definito (_X86_) &&! definito (_IA64_) &&! definito (_AMD64_) && defined (_M_AMD64) –

+0

@Edwin Se '_AMD64_' o' _IA64_' è stato definito, allora non avrebbe ricevuto l'errore. Questo è ciò che dice il file di intestazione. –

+0

philipvr ha aggiornato il suo post. Ha altri (più) problemi. Sta pensando di reinstallare MSVS. –

0

Se stai costruendo 32 bit, assicurati di non avere _WIN64 definito per il tuo progetto.

14

Un'altra causa di questo può includere un'intestazione che dipende da windows.h, prima di includere windows.h.

Nel mio caso ho incluso xinput.h prima del windows.h e ho ricevuto questo errore. Scambiare l'ordine ha risolto il problema.

+3

Esattamente la mia soluzione! Grazie per avermi risparmiato ore di frustrazione. – Acidic

1

Un altro motivo dell'errore (tra molti altri che si sono verificati quando si modificava la build di destinazione di un progetto Win32 in X64) non stava avendo compilatori C++ a 64 bit installati come indicato nella parte superiore di this page.
A seguito philipvr di commentare le intestazioni dei bambini, (nel mio caso) un esplicito comprendono di winnt.h essere unnecessary quando windows.h è stato utilizzato.

0

Ho avuto un problema simile.Nel mio caso, ho accidentalmente incluso winuser.h prima del windows.h (in realtà, un'estensione IDE bacata l'aveva aggiunto). La rimozione di winuser.h ha risolto il problema.