Quando tento compilar meu projeto c ++ usando o Visual Studio 2010 no modo Win32 ou x64, recebo o seguinte erro:
>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(135): fatal error C1189: #error : "No Target Architecture"
Minhas definições de pré-processador dizem WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)
O que está causando esse erro e como faço para corrigi-lo?
// 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
Atualização: criei um novo projeto msvs e copiei meu código para ele. Eu não tenho mais error : "No Target Architecture"
, mas agora tenho um monte de erros de compilação envolvendo winnt.h e winbase.h e nenhum erro de compilação envolvendo nenhum dos meus arquivos. É possível que esses arquivos estejam corrompidos? Eu preciso reinstalar o MSVS 2010?
Atualização 2: diminuí meu problema e descobri que é ele #include <WinDef.h>
que está causando todos os meus erros de compilação com winnt.h, mas ainda não sei como corrigi-lo.
fonte
Respostas:
Use em
#include <windows.h>
vez de#include <windef.h>
.Na
windows.h
página da wikipedia:windef.h
é um dos arquivos incluídos automaticamentewindows.h
.fonte
#error Hey man you gotta choose a target.
. O que mais poderia consertar isso?Outra causa pode ser a inclusão de um cabeçalho do qual depende
windows.h
, antes de incluirwindows.h
.No meu caso incluí
xinput.h
anteswindows.h
e recebi esse erro. Trocar o pedido resolveu o problema.fonte
O identificador _WIN32 não foi definido.
usar
#include <SDKDDKVer.h>
Os projetos gerados por MSVS envolvem isso, gerando um local
"targetver.h"
que é incluído por"stdafx.h"
que é compilado em um cabeçalho pré-compilado"stdafx.cpp"
.EDIT: você tem um / D "WIN32" em sua linha de comando?
fonte
_WIN32
vez deWIN32
? Não é minha área de especialização, mas considerando que o cabeçalho está procurando_WIN64
, '_AMD64_` etc., parece plausível.Parece que
_AMD64_
não está definido, já que não consigo imaginar que você esteja compilando para Itanium (_IA64_
).fonte
_AMD64_
ou_IA64_
fosse definido, ele não receberia o erro. Isso é o que diz o arquivo de cabeçalho.Resolva colocando os seguintes arquivos de inclusão e definição primeiro:
fonte
#include <WinUser.h>
.No início do arquivo que você está compilando, antes de qualquer
include
, tente colocar UMA destas linhasEscolha o apropriado, apenas um, dependendo de sua arquitetura.
fonte
Se você estiver usando o ReSharper, certifique-se de que ele não adiciona o cabeçalho errado para você; casos muito comuns com o ReSharper são:
-
#include <consoleapi2.h
-
#include <apiquery2.h>
ATUALIZAÇÃO :
Outra sugestão é verificar se você está incluindo um "Windows.h parcial", o que quero dizer é que se você incluir por exemplo winbase.h ou minwindef.h você pode acabar com esse erro, adicione "o grande" ao invés Windows.h. Existem também alguns casos menos óbvios pelos quais eu passei, o mais notável foi quando eu apenas incluí synchapi.h, a documentação afirma claramente que é o cabeçalho a ser incluído para algumas funções como AcquireSRWLockShared, mas acionou a arquitetura No target, a correção era remover o synchapi.h e incluir "o grande" Windows.h. O Windows.h é enorme, ele define macros (muitos deles removem o erro No target arch error) e incluem muitos outros cabeçalhos. Em resumo , sempre verifique se você está incluindo alguns cabeçalho que poderia ser substituído pelo Windows.
fonte
Outro motivo para o erro (entre muitos outros que surgiram ao alterar a compilação de destino de um projeto Win32 para X64) foi não ter os compiladores C ++ de 64 bits instalados, conforme observado no início desta página .
Além do comentário de philipvr sobre cabeçalhos filhos, (no meu caso) uma inclusão explícita de winnt.h sendo desnecessária quando windows.h estava sendo usado.
fonte
Eu tive um problema parecido. No meu caso, eu tinha incluído acidentalmente
winuser.h
anteswindows.h
(na verdade, uma extensão IDE com erros o tinha adicionado). Remover owinuser.h
resolveu o problema.fonte
consoleapi2.h
Além das causas já descritas, recebi este erro porque incluiria:
Aparentemente, não era necessário (apesar da chamada CreateDirectoryW). Depois de comentar, o compilador ficou feliz. Muito estranho.
fonte
Se você estiver construindo 32 bits, certifique-se de não ter _WIN64 definido para o seu projeto.
fonte