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.
la source
Réponses:
Utilisez à la
#include <windows.h>
place de#include <windef.h>
.Depuis la
windows.h
page wikipedia:windef.h
est l'un des fichiers automatiquement inclus avecwindows.h
.la source
#error Hey man you gotta choose a target.
. Qu'est-ce qui pourrait résoudre ce problème?Une autre cause peut être l'inclusion d'un en-tête qui dépend de
windows.h
, avant d'inclurewindows.h
.Dans mon cas, j'ai inclus
xinput.h
avantwindows.h
et j'ai obtenu cette erreur. L'échange de commande a résolu le problème.la source
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?
la source
_WIN32
plutôt queWIN32
? Ce n'est pas mon domaine d'expertise, mais étant donné que l'en-tête recherche_WIN64
«_AMD64_», etc., cela semble plausible.Il semblerait que ce
_AMD64_
ne soit pas défini, car je ne peux pas imaginer que vous compilez pour Itanium (_IA64_
).la source
_AMD64_
ou_IA64_
était défini, alors il n'obtiendrait pas l'erreur. C'est ce que dit le fichier d'en-tête.Résolvez-le en plaçant en premier les fichiers d'inclusion et la définition suivants:
la source
#include <WinUser.h>
.Au début du fichier que vous compilez, avant tout
include
, essayez de mettre UNE de ces lignesChoisissez le bon, un seul, en fonction de votre architecture.
la source
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.
la source
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é.
la source
J'avais un problème similaire. Dans mon cas, j'avais accidentellement inclus
winuser.h
avantwindows.h
(en fait, une extension IDE buggy l'avait ajouté). La suppression du awinuser.h
résolu le problème.la source
consoleapi2.h
Outre les causes déjà décrites, j'ai reçu cette erreur car j'inclurais:
Apparemment, ce n'était pas nécessaire (malgré l'appel de CreateDirectoryW). Après avoir commenté, le compilateur était content. Très étrange.
la source
Si vous créez 32 bits, assurez-vous que _WIN64 n'est pas défini pour votre projet.
la source