Erro fatal: “No Target Architecture” no Visual Studio

96

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.

philipvr
fonte
Como faço para definir a arquitetura de destino para meu projeto?
philipvr
Um projeto vanilla não falha dessa forma. O que você mudou de um projeto vanilla? O que está na linha 135 de winnt.h? Você ao menos olhou para aquela linha do arquivo de cabeçalho. A mensagem de erro está ajudando você.
David Heffernan
você deve ser capaz de resolver isso daqui; provavelmente precisará voltar antes da linha 127 para obter o quadro completo. Parece claro que Edwin estava certo.
David Heffernan
Tente um novo projeto msvs (fictício) e copie e arraste seus fontes para ele. Tente compilá-lo e, se isso acontecer, compare-o com o seu projeto original. BTW, não copie o stdafx. *
engf-010
Parece ruim. Mas antes de fazer uma reinstalação, primeiro você pode tentar com uma nova solução e se isso não funcionar, você pode reinstalar manualmente o project = templates (google it).
engf-010

Respostas:

146

Use em #include <windows.h>vez de #include <windef.h>.

Na windows.hpágina da wikipedia:

Existem vários arquivos de cabeçalho filho que são incluídos automaticamente no windows.h. Muitos desses arquivos não podem simplesmente ser incluídos por si próprios (eles não são autocontidos ), devido às dependências.

windef.hé um dos arquivos incluídos automaticamente windows.h.

philipvr
fonte
Eu pensei nisso, mas não consigo imaginar que você não incluiu windows.h.
engf-010
1
windows.h define alkinds de outros define com base em opções de compilador e inclui muitos cabeçalhos WINAPI, alguns dos quais dependendo das coisas definidas por windows.h.
engf-010
parabéns, você corrigiu o seu problema e tem representantes suficientes para votar!
David Heffernan
1
Nem windows.h nem windowsx.h (suponho que sejam a mesma coisa, mas tentei os dois mesmo assim) ajudam com isso #error Hey man you gotta choose a target.. O que mais poderia consertar isso?
rsethc
Atenção: parece incluir Xinput.h antes de Windows.h causar isso também.
Jens Åkerblom
24

Outra causa pode ser a inclusão de um cabeçalho do qual depende windows.h, antes de incluir windows.h.

No meu caso incluí xinput.hantes windows.he recebi esse erro. Trocar o pedido resolveu o problema.

Nathan Reed
fonte
4
Exatamente minha solução! Obrigado por me poupar horas de frustração.
Acidic9
5

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?

engf-010
fonte
Deveria ser em _WIN32vez de WIN32? Não é minha área de especialização, mas considerando que o cabeçalho está procurando _WIN64, '_AMD64_` etc., parece plausível.
David Heffernan
@David Heffernan: na linha de comando diz WIN32 (sem _) mesmo para x84. Não sei a razão disso (mas quem entende MS)
engf-010
4
@Edwin x84? Esse é o computador de George Orwell?
David Heffernan
@David Heffernan: sim, irmão mais velho está me observando! (obviamente x64 eu quis dizer)
engf-010
No meu caso _WIN32 foi definido e foi o culpado. Eu estava construindo para x64. Sua resposta me colocou no caminho certo. Bom trabalho!
Herve Mutombo
4

Parece que _AMD64_não está definido, já que não consigo imaginar que você esteja compilando para Itanium ( _IA64_).

David Heffernan
fonte
AMD64 será definido sob algumas condições: #if! Definido ( 68K ) &&! Definido ( MPPC ) &&! Definido ( X86 ) &&! Definido ( IA64 ) &&! Definido ( AMD64 ) && definido (_M_AMD64)
engf-010
@Edwin Se _AMD64_ou _IA64_fosse definido, ele não receberia o erro. Isso é o que diz o arquivo de cabeçalho.
David Heffernan
philipvr atualizou sua postagem. Ele tem outros (mais) problemas. Ele está pensando em reinstalar o MSVS.
engf-010
3

Resolva colocando os seguintes arquivos de inclusão e definição primeiro:

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

#include <windows.h>
Michael Haephrati
fonte
Isso corrigiu minhas compilações x86 e x64. Eu precisava adicionar essas linhas antes #include <WinUser.h>.
Jonathan Lidbeck
2

No início do arquivo que você está compilando, antes de qualquer include, tente colocar UMA destas linhas

#define _X86_
#define _AMD64_
#define _ARM_

Escolha o apropriado, apenas um, dependendo de sua arquitetura.

Andrea Araldo
fonte
2

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.

Melardev
fonte
1

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.

Laurie Stearn
fonte
Outra visita a esta página surgiu quando um projeto antigo tinha `#include <synchapi.h>` em um cabeçalho CriticalSection.
Laurie Stearn
1

Eu tive um problema parecido. No meu caso, eu tinha incluído acidentalmente winuser.hantes windows.h(na verdade, uma extensão IDE com erros o tinha adicionado). Remover o winuser.hresolveu o problema.

MxNx
fonte
1
Para mim ReSharper adicionadoconsoleapi2.h
SWdV
1

Além das causas já descritas, recebi este erro porque incluiria:

#include <fileapi.h>

Aparentemente, não era necessário (apesar da chamada CreateDirectoryW). Depois de comentar, o compilador ficou feliz. Muito estranho.

Shital Shah
fonte
0

Se você estiver construindo 32 bits, certifique-se de não ter _WIN64 definido para o seu projeto.

Brian
fonte