Erreur fatale: "Aucune architecture cible" dans Visual Studio

96

Lorsque j'essaie de compiler mon projet C ++ à l'aide de Visual Studio 2010 en mode Win32 ou x64, j'obtiens l'erreur suivante:

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

Mes définitions de préprocesseur disent WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)

Quelle est la cause de cette erreur et comment la corriger?

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

Mise à jour: j'ai créé un nouveau projet msvs et y ai copié mon code. Je ne l'ai plus error : "No Target Architecture", mais maintenant j'ai un tas d'erreurs de compilation impliquant winnt.h et winbase.h et aucune erreur de compilation impliquant aucun de mes fichiers. Est-il possible que ces fichiers soient corrompus? Dois-je réinstaller MSVS 2010?

Mise à jour 2: J'ai donc réduit mon problème et j'ai découvert que c'était #include <WinDef.h>à l'origine de toutes mes erreurs de compilation avec winnt.h mais je ne sais toujours pas comment le résoudre.

philipvr
la source
Comment définir l'architecture cible de mon projet?
philipvr
Un projet vanilla n'échoue pas de cette façon. Qu'avez-vous changé d'un projet vanilla? Qu'y a-t-il à la ligne 135 de winnt.h? Avez-vous même regardé cette ligne du fichier d'en-tête. Le message d'erreur vous aide.
David Heffernan
vous devriez pouvoir le résoudre à partir d'ici; il faut probablement revenir avant la ligne 127 pour avoir une image complète. Il semblerait clair qu'Edwin avait raison.
David Heffernan
Essayez un nouveau projet msvs (factice) et copiez-faites glisser vos sources dedans. Essayez de le compiler et si c'est le cas, comparez-le avec votre projet d'origine. BTW ne copiez pas le stdafx. *
engf-010
Ça sonne mal. Mais avant de procéder à une réinstallation, vous pouvez d'abord l'essayer avec une nouvelle solution et si cela ne fonctionne pas, vous pouvez réinstaller manuellement project = templates (google it).
engf-010

Réponses:

146

Utilisez à la #include <windows.h>place de #include <windef.h>.

Depuis la windows.hpage wikipedia:

Il existe un certain nombre de fichiers d'en-tête enfants qui sont automatiquement inclus avec windows.h. Beaucoup de ces fichiers ne peuvent pas simplement être inclus par eux-mêmes (ils ne sont pas autonomes ), à cause des dépendances.

windef.hest l'un des fichiers automatiquement inclus avec windows.h.

philipvr
la source
J'ai pensé à cela, mais je ne pouvais pas imaginer que vous n'incluiez pas windows.h.
engf-010
1
windows.h définit les alkinds d'autres définitions basées sur les commutateurs du compilateur et inclut de nombreux en-têtes WINAPI, dont certains dépendent des éléments définis par windows.h.
engf-010
Félicitations, vous avez résolu votre problème et vous avez assez de représentants pour voter!
David Heffernan
1
Ni windows.h ni windowsx.h (je suppose qu'ils sont la même chose mais j'ai quand même essayé les deux) ne vous aident pas #error Hey man you gotta choose a target.. Qu'est-ce qui pourrait résoudre ce problème?
rsethc
Attention: semble inclure Xinput.h avant que Windows.h ne provoque cela aussi.
Jens Åkerblom
24

Une autre cause peut être l'inclusion d'un en-tête qui dépend de windows.h, avant d'inclure windows.h.

Dans mon cas, j'ai inclus xinput.havant windows.het j'ai obtenu cette erreur. L'échange de commande a résolu le problème.

Nathan Reed
la source
4
Exactement ma solution! Merci de m'avoir épargné des heures de frustration.
Acidic9
5

L'identifiant _WIN32 n'est pas défini.

utilisation #include <SDKDDKVer.h>

Les projets générés par MSVS encapsulent cette inclusion en générant un local "targetver.h"qui est inclus par "stdafx.h"celui-ci est compilé dans un en-tête précompilé "stdafx.cpp".

EDIT: avez-vous un / D "WIN32" sur votre ligne de commande?

engf-010
la source
Doit-il être _WIN32plutôt que WIN32? Ce n'est pas mon domaine d'expertise, mais étant donné que l'en-tête recherche _WIN64«_AMD64_», etc., cela semble plausible.
David Heffernan
@David Heffernan: sur la ligne de commande, il est indiqué WIN32 (no _) même pour x84. Je ne connais pas la raison (mais qui comprend la SP)
engf-010
4
@Edwin x84? Est-ce l'ordinateur de George Orwell?
David Heffernan
@David Heffernan: oui, mon grand frère me regarde! (évidemment x64 je voulais dire)
engf-010
Dans mon cas, _WIN32 a été défini et était le coupable. Je construisais pour x64. Votre réponse m'a mis sur la bonne voie. Bon travail!
Herve Mutombo le
4

Il semblerait que ce _AMD64_ne soit pas défini, car je ne peux pas imaginer que vous compilez pour Itanium ( _IA64_).

David Heffernan
la source
AMD64 sera défini sous certaines conditions: #if! Defined ( 68K ) &&! Defined ( MPPC ) &&! Defined ( X86 ) &&! Defined ( IA64 ) &&! Defined ( AMD64 ) && defined (_M_AMD64)
engf-010
@Edwin Si _AMD64_ou _IA64_était défini, alors il n'obtiendrait pas l'erreur. C'est ce que dit le fichier d'en-tête.
David Heffernan
philipvr a mis à jour son message. Il a d'autres (plus) problèmes. Il pense réinstaller MSVS.
engf-010
3

Résolvez-le en plaçant en premier les fichiers d'inclusion et la définition suivants:

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

#include <windows.h>
Michael Haephrati
la source
Cela a corrigé mes versions x86 et x64. J'avais besoin d'ajouter ces lignes avant #include <WinUser.h>.
Jonathan Lidbeck le
2

Au début du fichier que vous compilez, avant tout include, essayez de mettre UNE de ces lignes

#define _X86_
#define _AMD64_
#define _ARM_

Choisissez le bon, un seul, en fonction de votre architecture.

Andrea Araldo
la source
2

Si vous utilisez Resharper, assurez-vous qu'il n'ajoute pas le mauvais en-tête pour vous, les cas très courants avec ReSharper sont:
- #include <consoleapi2.h
-#include <apiquery2.h>

MISE À JOUR :
Une autre suggestion est de vérifier si vous incluez un "Windows.h partiel", ce que je veux dire, c'est que si vous incluez par exemple winbase.h ou minwindef.h, vous risquez de vous retrouver avec cette erreur, ajoutez "le grand" à la place Windows.h. Il y a aussi des cas moins évidents que j'ai traversés, le plus notable était lorsque je n'ai inclus que synchapi.h, la documentation indique clairement que c'est l'en-tête à inclure pour certaines fonctions comme AcquireSRWLockShared mais cela a déclenché l'architecture No target, le correctif était de supprimer le synchapi.h et d'inclure "le grand" Windows.h. Le Windows.h est énorme, il définit des macros (beaucoup d'entre elles suppriment l'erreur No target arch) et incluent de nombreux autres en-têtes. En résumé , vérifiez toujours si vous incluez un en-tête qui pourrait être remplacé par Windows.

Melardev
la source
1

Une autre raison de l'erreur (parmi beaucoup d'autres qui s'est produite lors du changement de la version cible d'un projet Win32 en X64) était de ne pas avoir les compilateurs C ++ 64 bits installés comme indiqué en haut de cette page .
Suite au commentaire de philipvr sur les en-têtes enfants, (dans mon cas) une inclusion explicite de winnt.h n'est pas nécessaire lorsque windows.h était utilisé.

Laurie Stearn
la source
Une autre visite sur cette page a eu lieu lorsqu'un ancien projet avait `#include <synchapi.h>` dans un en-tête CriticalSection.
Laurie Stearn
1

J'avais un problème similaire. Dans mon cas, j'avais accidentellement inclus winuser.havant windows.h(en fait, une extension IDE buggy l'avait ajouté). La suppression du a winuser.hrésolu le problème.

MxNx
la source
1
For me ReSharper ajoutéconsoleapi2.h
SWdV
1

Outre les causes déjà décrites, j'ai reçu cette erreur car j'inclurais:

#include <fileapi.h>

Apparemment, ce n'était pas nécessaire (malgré l'appel de CreateDirectoryW). Après avoir commenté, le compilateur était content. Très étrange.

Shital Shah
la source
0

Si vous créez 32 bits, assurez-vous que _WIN64 n'est pas défini pour votre projet.

Brian
la source