163 votes

Erreur fatale : "No Target Architecture" dans Visual Studio

Lorsque j'essaie de compiler mon projet c++ avec 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 puis-je 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 j'y ai copié mon code. Je n'ai plus de 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 n'impliquant aucun de mes fichiers. Est-il possible que ces fichiers soient corrompus ? Dois-je réinstaller MSVS 2010 ?

Mise à jour 2 : J'ai réduit mon problème et j'ai découvert qu'il s'agit de #include <WinDef.h> qui est à l'origine de toutes mes erreurs de compilation avec winnt.h mais je ne sais toujours pas comment y remédier.

232voto

philipvr Points 1155

Utilisation #include <windows.h> au lieu de #include <windef.h> .

A partir de la windows.h page wikipedia :

Un certain nombre de fichiers d'en-tête enfants sont automatiquement inclus dans le programme windows.h . Beaucoup de ces fichiers ne peuvent pas être inclus seuls (ils ne sont pas des autonome ), en raison des dépendances.

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

44voto

Nathan Reed Points 695

Une autre cause de ce problème 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 obtenu cette erreur. L'inversion de la commande a résolu le problème.

16voto

Michael Haephrati Points 145

Résolvez le problème en plaçant les fichiers include et la définition suivants en premier :

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

#include <windows.h>

12voto

Melardev Points 322

Si vous utilisez Resharper, assurez-vous qu'il n'ajoute pas le mauvais en-tête pour vous, les cas les plus courants avec ReSharper sont les suivants :

  • #include <consoleapi2.h

  • #include <apiquery2.h>

  • #include <fileapi.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 pouvez vous retrouver avec cette erreur, ajoutez le "gros" Windows.h à la place. Il y a aussi des cas moins évidents que j'ai rencontrés, le plus notable étant 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'erreur No target architecture, la solution a été de supprimer synchapi.h et d'inclure le "gros" Windows.h.

Le fichier Windows.h est énorme, il définit des macros (beaucoup d'entre elles suppriment l'erreur No target arch) et inclut de nombreux autres en-têtes. En résumé Dans ce cas, vérifiez toujours si vous n'incluez pas un en-tête qui pourrait être remplacé par Windows.h car il n'est pas rare d'inclure un en-tête qui repose sur certaines constantes définies par Windows.h. Si vous n'incluez pas cet en-tête, votre compilation risque d'échouer.

6voto

Windows 10x64 pro build 19044.1586

Mon cas était dans l'ordre des fichiers .h

Comme ça, ça ne marche pas

#include <processthreadsapi.h>
#include <iostream>
#include <windows.h>

Mais cela fonctionne comme suit

#include <windows.h>
#include <iostream>
#include <processthreadsapi.h>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X