developer tip

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

copycodes 2020. 9. 24. 07:58
반응형

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


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로 모든 컴파일 오류를 일으키는 것으로 나타 났지만 여전히 해결 방법을 모르겠습니다.


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

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

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

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


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

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


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

사용하다 #include <SDKDDKVer.h>

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

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


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


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


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


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


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

#include <fileapi.h>

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


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

#define _X86_
#define _AMD64_
#define _ARM_

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


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

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

#include <windows.h>

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

UPDATE:
Another suggestion is to check if you are including a "partial Windows.h", what I mean is that if you include for example winbase.h or minwindef.h you may end up with that error, add "the big" instead Windows.h. There are also some less obvious cases that I went through, the most notable was when I only included synchapi.h, the docs clearly states that is the header to be included for some functions like AcquireSRWLockShared but it triggered the No target architecture, the fix was to remove the synchapi.h and include "the big" Windows.h. The Windows.h is hughe, it defines macros(many of them remove the No target arch error) and include many other headers. In summary, always check if you are including some header that could be replaced by Windows.h.

참고URL : https://stackoverflow.com/questions/4845198/fatal-error-no-target-architecture-in-visual-studio

반응형