치명적인 오류 : Visual Studio의 "대상 아키텍처 없음"


96

Win32 또는 x64 모드에서 Visual Studio 2010을 사용하여 C ++ 프로젝트를 컴파일하려고하면 다음 오류가 발생합니다.

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

내 전 처리기 정의에 WIN32; _DEBUG; _CONSOLE; % (PreprocessorDefinitions)

이 오류의 원인은 무엇이며 어떻게 해결합니까?

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

업데이트 : 새 msvs 프로젝트를 만들고 여기에 코드를 복사했습니다. 나는 더 이상 가지고 있지 않다error : "No Target Architecture" 않지만 이제 winnt.h 및 winbase.h와 관련된 컴파일 오류가 많고 내 파일과 관련된 컴파일 오류가 없습니다. 이러한 파일이 손상되었을 수 있습니까? MSVS 2010을 다시 설치해야합니까?

업데이트 2 : 그래서 내 문제를 좁혀서 #include <WinDef.h>winnt.h로 모든 컴파일 오류를 일으키는 것으로 나타 났지만 여전히 해결 방법을 모르겠습니다.


내 프로젝트의 대상 아키텍처를 어떻게 설정합니까?
philipvr 2011 년

바닐라 프로젝트는 이런 식으로 실패하지 않습니다. 바닐라 프로젝트에서 무엇을 변경 했습니까? winnt.h의 135 번째 줄에 무엇이 있습니까? 헤더 파일의 해당 줄을 보셨습니까? 오류 메시지가 도움을줍니다.
David Heffernan 2011 년

여기에서 해결할 수있을 것입니다. 전체 그림을 얻으려면 127 행 이전으로 돌아 가야합니다. Edwin이 옳았다는 것이 분명해 보입니다.
David Heffernan 2011 년

새 msvs 프로젝트 (더미)를 시도하고 소스를 복사하여 여기로 드래그하십시오. 컴파일을 시도하고 만약 그렇다면 원래 프로젝트와 비교하십시오. BTW는 stdafx를 복사하지 않습니다. *
engf-010 2011

나쁘게 들립니다. 그러나 다시 설치하기 전에 먼저 새로운 솔루션으로 시도해 볼 수 있으며 작동하지 않으면 수동으로 project = templates (google it)를 다시 설치할 수 있습니다.
engf-010 2011

답변:


146

사용 #include <windows.h>대신에 #include <windef.h>.

로부터 windows.h위키 피 디아 페이지 :

에 자동으로 포함되는 여러 하위 헤더 파일이 있습니다 windows.h. 이러한 파일의 대부분은 종속성으로 인해 자체적으로 포함 할 수 없습니다 ( 자체 포함 되지 않음 ).

windef.h에 자동으로 포함 된 파일 중 하나입니다 windows.h.


나는 그것을 생각했지만 당신이 창문을 포함하지 않았다는 것을 상상할 수 없었습니다 .h.
engf-010

1
windows.h는 컴파일러 스위치를 기반으로 다른 정의의 모든 종류를 정의하고 많은 WINAPI- 헤더를 포함하며, 그중 일부는 windows.h에 의해 정의 된 것에 따라 다릅니다.
engf-010

축하합니다. 문제를 해결 했으며 투표 할 충분한 담당자가 있습니다!
David Heffernan 2011 년

1
windowsx.h가 아닌 windows.h (동일한 것으로 가정하지만 어쨌든 둘 다 시도했습니다) 도움이되지 않습니다 #error Hey man you gotta choose a target.. 다른 무엇을 고칠 수 있습니까?
rsethc 2014 년

주의 : Windows.h가 이것을 유발하기 전에 Xinput.h를 포함하는 것 같습니다.
Jens Åkerblom

24

이것의 또 다른 원인은 포함 windows.h하기 전에에 종속 된 헤더를 포함 할 수 있습니다 windows.h.

제 경우에는 xinput.h이전에 포함 windows.h시켰는데이 오류가 발생했습니다. 주문을 바꾸면 문제가 해결되었습니다.


4
정확히 내 솔루션! 시간을 절약 해주셔서 감사합니다.
Acidic9

5

_WIN32 식별자가 정의되지 않았습니다.

사용하다 #include <SDKDDKVer.h>

MSVS 생성 프로젝트 는 .NET을 통해 미리 컴파일 된 헤더로 컴파일 "targetver.h"되는에 포함 된 로컬 을 생성하여이를 래핑합니다 ."stdafx.h""stdafx.cpp"

편집 : 명령 줄에 / D "WIN32"가 있습니까?


그것은해야 _WIN32보다는 WIN32? 내 전문 분야는 아니지만 헤더가 _WIN64'_AMD64_'등을 찾고 있다는 점을 감안할 때 그럴듯 해 보일 것입니다.
David Heffernan 2011 년

@David Heffernan : 명령 줄에서 x84의 경우에도 WIN32 (_ 없음)라고 표시됩니다. 그것의 이론적 근거를 몰라 (하지만 누가 MS를 이해 않음)
engf-010

4
@Edwin x84? 조지 오웰의 컴퓨터인가요?
David Heffernan 2011 년

@David Heffernan : 네, 형님이 나를보고 있습니다! (분명히 x64 의미)
engf-010 2011

제 경우에는 _WIN32가 정의되었고 범인이었습니다. 나는 x64를 위해 만들고 있었다. 당신의 대답은 나를 궤도에 올려 놓았습니다. 잘 했어!
Herve Mutombo

4

_AMD64_Itanium ( _IA64_)을 위해 컴파일하는 것을 상상할 수 없기 때문에 정의되지 않은 것 같습니다 .


AMD64 는 다음과 같은 일부 조건에서 정의됩니다. # if! defined ( 68K ) &&! defined ( MPPC ) &&! defined ( X86 ) &&! defined ( IA64 ) &&! defined ( AMD64 ) && defined (_M_AMD64)
engf-010

@Edwin _AMD64_또는 _IA64_정의 된 경우 오류가 발생하지 않습니다. 그것이 헤더 파일이 말하는 것입니다.
David Heffernan 2011 년

philipvr이 자신의 게시물을 업데이트했습니다. 그는 다른 (더 많은) 문제가 있습니다. 그는 MSVS를 다시 설치할 생각입니다.
engf-010 2011

3

다음 포함 파일 및 정의를 먼저 배치하여 문제를 해결하십시오.

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

#include <windows.h>

이것은 내 x86 및 x64 빌드를 모두 수정했습니다. 전에이 줄을 추가해야했습니다 #include <WinUser.h>.
Jonathan Lidbeck

2

컴파일하는 파일의 시작 부분에, 앞에 include다음 줄 중 하나를 넣으십시오.

#define _X86_
#define _AMD64_
#define _ARM_

아키텍처에 따라 적절한 하나만 선택하십시오.


2

당신이 ReSharper에서 메이크업을 사용하는 경우 반드시 당신을 위해 잘못된 헤더를 추가하지 않습니다, ReSharper에서 매우 일반적인 경우는 다음과 같습니다
- #include <consoleapi2.h
-#include <apiquery2.h>

업데이트 :
또 다른 제안은 "일부 Windows.h"를 포함하고 있는지 확인하는 것입니다. 내 말은 예를 들어 winbase.h 또는 minwindef.h를 포함하면 해당 오류가 발생할 수 있으며 대신 "the big"을 추가 할 수 있습니다. Windows.h. 내가 겪은 덜 분명한 경우도 있습니다. 가장 주목할만한 것은 synchapi.h 만 포함했을 때였습니다. 문서에는 AcquireSRWLockShared와 같은 일부 기능에 포함될 헤더가 명시되어 있지만 대상 아키텍처 없음, 수정 사항이 트리거되었습니다. synchapi.h를 제거하고 "the big"Windows.h를 포함하는 것이 었습니다. Windows.h는 휴, 매크로를 정의하고 (대부분은 No target arch 오류를 제거함) 다른 많은 헤더를 포함합니다. 요약하면 Windows로 대체 될 수있는 일부 헤더를 포함하고 있는지 항상 확인하십시오 .


1

이 오류의 또 다른 이유 (Win32 프로젝트의 대상 빌드를 X64로 변경할 때 발생하는 다른 많은 오류 중에서)는 이 페이지 상단에 명시된대로 C ++ 64 비트 컴파일러를 설치하지 않았기 때문 입니다.
자식 헤더에 대한 philipvr의 의견 외에도 (내 경우에는) windows.h 가 사용될 때 불필요한 winnt.h 가 명시 적으로 포함 되었습니다.


이전 프로젝트의 CriticalSection 헤더에`#include <synchapi.h>`가있는 경우이 페이지를 다시 방문했습니다.
Laurie Stearn

1

비슷한 문제가있었습니다. 제 경우에는 실수로 winuser.h이전에 포함 시켰습니다 windows.h(실제로는 버그가있는 IDE 확장이 추가했습니다). 제거하면 winuser.h문제가 해결되었습니다.


1
나를 위해 ReSharper 추가consoleapi2.h
SWdV

1

이미 설명한 원인 외에도 다음을 포함하기 때문에이 오류가 발생했습니다.

#include <fileapi.h>

분명히 그것은 필요하지 않았습니다 (CreateDirectoryW 호출에도 불구하고). 주석 처리 후 컴파일러는 기뻤습니다. 아주 이상한.


0

32 비트를 빌드하는 경우 프로젝트에 _WIN64가 정의되어 있지 않은지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.