Lorsque j'essaie de compiler mon projet c ++ à l'aide de Visual Studio 2010 en mode Win32 ou x64, le message d'erreur suivant s'affiche:
>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)
Qu'est-ce qui cause cette erreur et comment puis-je la réparer?
// 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 n'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 limité mon problème et découvert que c’est le #include <WinDef.h>
qui cause toutes mes erreurs de compilation avec winnt.h mais je ne sais toujours pas comment le résoudre.
Utilisez #include <windows.h>
au lieu de #include <windef.h>
.
De la page windows.h
wikipedia:
Un certain nombre de fichiers d'en-tête enfant 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.h
est l’un des fichiers automatiquement inclus avec windows.h
.
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.h
avant windows.h
et j'ai eu cette erreur. Échanger la commande a résolu le problème.
L'identifiant _WIN32 n'est pas défini.
utiliser #include <SDKDDKVer.h>
Les projets générés par MSVS encapsulent cette inclusion en générant un "targetver.h"
local, inclus par "stdafx.h"
, comilé dans un en-tête précompilé par le biais de "stdafx.cpp"
.
EDIT: avez-vous un/D "WIN32" sur votre ligne de commande?
Il semblerait que _AMD64_
ne soit pas défini, car je ne peux pas imaginer que vous compiliez pour Itanium (_IA64_
).
Si vous construisez 32 bits, assurez-vous que _WIN64 n'est pas défini pour votre projet.
Une autre raison de l'erreur (parmi beaucoup d'autres qui sont apparues lors du changement de la construction cible d'un projet Win32 en X64) était que les compilateurs C++ 64 bits n'étaient pas 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 étant inutile quand windows.h était utilisé.
J'avais un problème similaire. Dans mon cas, j'avais accidentellement inclus winuser.h
avant windows.h
(en fait, une extension buggy IDE l'avait ajoutée). Supprimer le winuser.h
a résolu le problème.
Si vous utilisez Resharper, assurez-vous qu’il n’ajoute pas le mauvais en-tête. Les cas les plus courants avec ReSharper sont les suivants:
- #include <consoleapi2.h
- #include <apiquery2.h>
UPDATE:
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 gros "à la place de Windows.h. Il y a aussi des cas moins évidents que j'ai décrits, le plus notable étant lorsque j'ai uniquement inclus synchapi.h, la documentation indique clairement que l'en-tête doit être inclus pour certaines fonctions telles que AcquireSRWLockShared, mais que cela a déclenché était de supprimer le synchapi.h et d'inclure "le gros" Windows.h. Le fichier Windows.h est énorme, il définit des macros (nombre d’entre elles suppriment l’erreur Aucune cible 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.h.
Résolvez-le en plaçant d'abord les fichiers d'inclusion et la définition suivants:
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
Au début du fichier que vous compilez, avant toute include
, essayez de mettre UNE de ces lignes
#define _X86_
#define _AMD64_
#define _ARM_
Choisissez celui qui convient, un seul, en fonction de votre architecture.
besoin d'installer ceci pour se débarrasser de ce problème, prenez du code smaple frais puis compilez ...
Outre les causes déjà décrites, j'ai reçu cette erreur parce que je voulais inclure:
#include <fileapi.h>
Apparemment, ce n'était pas nécessaire (malgré l'appel de CreateDirectoryW). Après avoir commenté, le compilateur était heureux. Très étrange.