Error fatal: "Arquitectura sin destino" en Visual Studio

96

Cuando intento compilar mi proyecto de C ++ usando Visual Studio 2010 en modo Win32 o x64, aparece el siguiente error:

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

Mis definiciones de preprocesador dicen WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)

¿Qué está causando este error y cómo lo soluciono?

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

Actualización: creé un nuevo proyecto de msvs y copié mi código en él. Ya no lo tengo error : "No Target Architecture", pero ahora tengo un montón de errores de compilación que involucran winnt.hy winbase.hy no hay errores de compilación que involucren ninguno de mis archivos. ¿Es posible que estos archivos estén dañados? ¿Necesito reinstalar MSVS 2010?

Actualización 2: Así que reduje mi problema y descubrí que es el #include <WinDef.h>que está causando todos mis errores de compilación con winnt.h, pero todavía no sé cómo solucionarlo.

philipvr
fuente
¿Cómo configuro la arquitectura de destino para mi proyecto?
philipvr
Un proyecto de vainilla no falla de esta manera. ¿Qué has cambiado de un proyecto de vainilla? ¿Qué hay en la línea 135 de winnt.h? ¿Ha mirado siquiera esa línea del archivo de encabezado? El mensaje de error te está ayudando.
David Heffernan
deberías poder resolverlo desde aquí; Probablemente necesite retroceder antes de la línea 127 para obtener una imagen completa. Parecería claro que Edwin tenía razón.
David Heffernan
Pruebe un nuevo proyecto msvs (ficticio) y copie y arrastre sus fuentes a él. Intente compilarlo y, si lo hace, compárelo con su proyecto original. Por cierto, no copie el stdafx. *
engf-010
Suena mal. Pero antes de volver a instalarlo, primero puede probarlo con una nueva solución y, si eso no funciona, puede volver a instalar manualmente project = templates (buscar en Google).
engf-010

Respuestas:

146

Utilizar en #include <windows.h>lugar de #include <windef.h>.

Desde la windows.hpágina de wikipedia:

Hay una serie de archivos de encabezado secundarios que se incluyen automáticamente con windows.h. Muchos de estos archivos no pueden simplemente incluirse por sí mismos (no son autónomos ), debido a las dependencias.

windef.hes uno de los archivos incluidos automáticamente con windows.h.

philipvr
fuente
Pensé en eso, pero no podía imaginar que no incluyeses windows.h.
engf-010
1
windows.h define tipos de otras definiciones basadas en conmutadores de compilador e incluye muchos encabezados WINAPI, algunos de los cuales dependen de las cosas definidas por windows.h.
engf-010
felicitaciones, ha solucionado su problema y tiene suficiente representante para votar!
David Heffernan
1
Ni windows.h ni windowsx.h (supongo que son lo mismo, pero he probado ambos de todos modos) ayudan con eso #error Hey man you gotta choose a target.. ¿Qué más podría arreglar eso?
rsethc
Aviso: parece que se incluye Xinput.h antes de que Windows.h cause esto también.
Jens Åkerblom
24

Otra causa de esto puede ser incluir un encabezado que depende de windows.h, antes de incluirlo windows.h.

En mi caso incluí xinput.hantes windows.hy obtuve este error. Cambiar el orden resolvió el problema.

Nathan Reed
fuente
4
¡Exactamente mi solución! Gracias por ahorrarme horas de frustración.
Acidic 9 de
5

El identificador _WIN32 no está definido.

utilizar #include <SDKDDKVer.h>

Los proyectos generados por MSVS envuelven esta inclusión generando un local "targetver.h"que se incluye y "stdafx.h"se compila en un encabezado precompilado "stdafx.cpp".

EDITAR: ¿tiene un / D "WIN32" en su línea de comandos?

engf-010
fuente
¿Debería ser en _WIN32lugar de WIN32? No es mi área de especialización, pero dado que el encabezado está buscando _WIN64'_AMD64_`, etc., parecería plausible.
David Heffernan
@David Heffernan: en la línea de comandos dice WIN32 (no _) incluso para x84. No sé la razón de ser de esto (pero quién entiende la EM)
engf-010
4
@Edwin x84? ¿Es esa la computadora de George Orwell?
David Heffernan
@David Heffernan: sí, ¡el hermano mayor me está mirando! (obviamente x64 quise decir)
engf-010
En mi caso, _WIN32 se definió y fue el culpable. Estaba construyendo para x64. Tu respuesta me puso en camino. ¡Buen trabajo!
Herve Mutombo
4

Parece que _AMD64_no está definido, ya que no puedo imaginar que esté compilando para Itanium ( _IA64_).

David Heffernan
fuente
AMD64 se definirá en algunas condiciones: # si! Definido ( 68K ) &&! Definido ( MPPC ) &&! Definido ( X86 ) &&! Definido ( IA64 ) &&! Definido ( AMD64 ) && definido (_M_AMD64)
engf-010
@Edwin Si se definiera _AMD64_o _IA64_, entonces no obtendría el error. Eso es lo que dice el archivo de encabezado.
David Heffernan
philipvr ha actualizado su publicación. Tiene otros (más) problemas. Está pensando en volver a instalar MSVS.
engf-010
3

Resuélvalo colocando primero los siguientes archivos de inclusión y definición:

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

#include <windows.h>
Michael Haephrati
fuente
Esto solucionó mis compilaciones x86 y x64. Necesitaba agregar estas líneas antes #include <WinUser.h>.
Jonathan Lidbeck
2

Al principio del archivo que está compilando, antes que ninguno include, intente poner UNA de estas líneas

#define _X86_
#define _AMD64_
#define _ARM_

Elija el adecuado, solo uno, según su arquitectura.

Andrea Araldo
fuente
2

Si está utilizando Resharper, asegúrese de que no agregue el encabezado incorrecto para usted, los casos muy comunes con ReSharper son:
- #include <consoleapi2.h
-#include <apiquery2.h>

ACTUALIZACIÓN :
Otra sugerencia es verificar si está incluyendo un "Windows.h parcial", lo que quiero decir es que si incluye, por ejemplo, winbase.ho minwindef.h puede terminar con ese error, agregue "el grande" en su lugar Windows.h. También hay algunos casos menos obvios por los que pasé, el más notable fue cuando solo incluí synchapi.h, los documentos indican claramente que es el encabezado que se incluirá para algunas funciones como AcquireSRWLockShared, pero activó la arquitectura No target, la solución era eliminar synchapi.h e incluir "el gran" Windows.h. Windows.h es hughe, define macros (muchas de ellas eliminan el error de arco No target) e incluyen muchos otros encabezados. En resumen , siempre verifique si está incluyendo algún encabezado que pueda ser reemplazado por Windows.

Melardev
fuente
1

Otra razón del error (entre muchas otras que surgieron al cambiar la compilación de destino de un proyecto Win32 a X64) fue no tener los compiladores C ++ de 64 bits instalados como se indica en la parte superior de esta página .
Además del comentario de philipvr sobre los encabezados secundarios, (en mi caso) una inclusión explícita de winnt.h es innecesaria cuando se usa windows.h .

Laurie Stearn
fuente
Otra visita a esta página surgió cuando un proyecto antiguo tenía `#include <synchapi.h>` en un encabezado de CriticalSection.
Laurie Stearn
1

Tuve un problema similar. En mi caso, lo había incluido accidentalmente winuser.hantes windows.h(en realidad, una extensión IDE con errores lo había agregado). Eliminar el winuser.hsolucionó el problema.

MxNx
fuente
1
Para mí ReSharper agregadoconsoleapi2.h
SWdV
1

Además de las causas descritas ya, recibí este error porque incluiría:

#include <fileapi.h>

Aparentemente no fue necesario (a pesar de la llamada CreateDirectoryW). Después de comentar, el compilador estaba feliz. Muy extraño.

Shital Shah
fuente
0

Si está construyendo 32 bits, asegúrese de no tener _WIN64 definido para su proyecto.

Brian
fuente