Errore irreversibile: "Nessuna architettura di destinazione" in Visual Studio


96

Quando provo a compilare il mio progetto c ++ utilizzando Visual Studio 2010 in modalità Win32 o x64 ottengo il seguente errore:

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

Le definizioni del mio preprocessore dicono WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)

Qual è la causa di questo errore e come posso risolverlo?

// 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 vi ho copiato il codice. Non ce l'ho più error : "No Target Architecture", ma ora ho un sacco di errori di compilazione che coinvolgono winnt.he winbase.he nessun errore di compilazione che coinvolge nessuno dei miei file. È possibile che questi file siano danneggiati? Devo reinstallare MSVS 2010?

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


Come imposto l'architettura di destinazione per il mio progetto?
philipvr

Un progetto vaniglia non fallisce in questo modo. Cosa sei cambiato da un progetto vaniglia? Cosa c'è alla riga 135 di winnt.h? Hai anche guardato quella riga del file di intestazione. Il messaggio di errore ti sta dando un po 'di aiuto.
David Heffernan

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 avesse ragione.
David Heffernan

Prova un nuovo progetto msvs (fittizio) e copia e trascina i tuoi sorgenti al suo interno. Prova a compilarlo e, se lo fa, confrontalo con il tuo progetto originale. BTW non copiare lo stdafx. *
engf-010

Suona male. Ma prima di eseguire una reinstallazione, puoi prima provarlo con una nuova soluzione e se non funziona puoi reinstallare manualmente project = templates (google it).
engf-010

Risposte:


146

Usa #include <windows.h>invece di #include <windef.h>.

Dalla windows.hpagina di wikipedia:

Esistono numerosi file di intestazione secondari che vengono automaticamente inclusi con windows.h. Molti di questi file non possono essere inclusi semplicemente da soli (non sono autonomi ), a causa delle dipendenze.

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


Ci avevo pensato, ma non ho potuto immaginare che non includessi windows.h.
engf-010

1
windows.h definisce i tipi di altre definizioni in base alle opzioni del compilatore e include molte intestazioni WINAPI, alcune delle quali dipendono da cose definite da windows.h.
engf-010

congratulazioni, hai risolto il tuo problema e hai abbastanza rappresentanti per votare!
David Heffernan

1
Né windows.h né windowsx.h (presumo che siano la stessa cosa ma ho provato entrambi comunque) aiutano con quello #error Hey man you gotta choose a target.. Cos'altro potrebbe risolverlo?
rsethc

Attenzione: sembra che includa Xinput.h prima che Windows.h causi anche questo.
Jens Åkerblom

24

Un'altra causa di ciò può essere l'inclusione di un'intestazione che dipende da windows.h, prima di includere windows.h.

Nel mio caso ho incluso xinput.hprima windows.he ho ricevuto questo errore. Lo scambio dell'ordine ha risolto il problema.


4
Esattamente la mia soluzione! Grazie per avermi risparmiato ore di frustrazione.
Acidic9

5

L'identificatore _WIN32 non è definito.

uso #include <SDKDDKVer.h>

I progetti generati da MSVS racchiudono questo include generando un locale "targetver.h"che è incluso da "stdafx.h"che viene inserito in un'intestazione precompilata "stdafx.cpp".

EDIT: hai un / D "WIN32" sulla tua riga di comando?


Dovrebbe essere _WIN32piuttosto che WIN32? Non è la mia area di competenza, ma dato che l'intestazione sta cercando _WIN64, '_AMD64_` ecc. Sembrerebbe plausibile.
David Heffernan

@David Heffernan: sulla riga di comando dice WIN32 (no _) anche per x84. Non ne conosco la logica (ma chi capisce la SM)
ita-010

4
@Edwin x84? Quello è il computer di George Orwell?
David Heffernan

@David Heffernan: sì, il fratello maggiore mi sta guardando! (ovviamente x64
volevo

Nel mio caso è stato definito _WIN32 ed è stato il colpevole. Stavo costruendo per x64. La tua risposta mi ha messo sulla buona strada. Buon lavoro!
Herve Mutombo

4

Sembrerebbe che _AMD64_non sia definito, dal momento che non riesco a immaginare che stai compilando per Itanium ( _IA64_).


AMD64 sarà definito in alcune condizioni: #if! Defined ( 68K ) &&! Defined ( MPPC ) &&! Defined ( X86 ) &&! Defined ( IA64 ) &&! Defined ( AMD64 ) && defined (_M_AMD64)
engf-010

@Edwin Se _AMD64_o _IA64_fosse definito, allora non avrebbe ricevuto l'errore. Questo è ciò che dice il file di intestazione.
David Heffernan

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

3

Risolvilo inserendo prima i seguenti file di inclusione e definizione:

#define WIN32_LEAN_AND_MEAN      // Exclude rarely-used stuff from Windows headers

#include <windows.h>

Questo ha risolto entrambe le mie build x86 e x64. Avevo bisogno di aggiungere queste righe prima #include <WinUser.h>.
Jonathan Lidbeck il

2

All'inizio del file che stai compilando, prima di ogni altra include, prova a mettere UNA di queste righe

#define _X86_
#define _AMD64_
#define _ARM_

Scegli quello appropriato, solo uno, a seconda della tua architettura.


2

Se stai usando Resharper assicurati che non aggiunga l'intestazione sbagliata per te, casi molto comuni con ReSharper sono:
- #include <consoleapi2.h
-#include <apiquery2.h>

AGGIORNAMENTO : un
altro suggerimento è controllare se stai includendo un "Windows.h parziale", quello che voglio dire è che se includi ad esempio winbase.h o minwindef.h potresti finire con quell'errore, aggiungi invece "il grande" Windows.h. Ci sono anche alcuni casi meno ovvi che ho attraversato, il più notevole è stato quando ho incluso solo synchapi.h, la documentazione afferma chiaramente che è l'intestazione da includere per alcune funzioni come AcquireSRWLockShared ma ha attivato l'architettura No target, la correzione era rimuovere il file synchapi.he includere il "grande" Windows.h. Windows.h è enorme, definisce le macro (molte di esse rimuovono l'errore Nessun arco di destinazione) e include molte altre intestazioni. In sintesi , controlla sempre se stai includendo qualche intestazione che potrebbe essere sostituita da Windows.


1

Un altro motivo dell'errore (tra i molti altri che sono emersi durante la modifica della build di destinazione di un progetto Win32 in X64) era il mancato installazione dei compilatori C ++ a 64 bit, come indicato nella parte superiore di questa pagina .
Oltre al commento di philipvr sulle intestazioni figlio, (nel mio caso) un'inclusione esplicita di winnt.h non è necessaria quando si utilizza windows.h .


Un'altra visita a questa pagina è avvenuta quando un vecchio progetto aveva "#include <synchapi.h>" in un'intestazione CriticalSection.
Laurie Stearn

1

Ho avuto un problema simile. Nel mio caso, l'avevo accidentalmente incluso winuser.hprima windows.h(in realtà, un'estensione IDE difettosa l'aveva aggiunta). Rimuovendo il winuser.hrisolto il problema.


1
Per me ReSharper ha aggiuntoconsoleapi2.h
SWdV

1

Oltre alle cause già descritte, ho ricevuto questo errore perché includevo:

#include <fileapi.h>

Apparentemente non era necessario (nonostante la chiamata a CreateDirectoryW). Dopo aver commentato, il compilatore era felice. Molto strano.


0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.