치명적인 오류 LNK1112 : 모듈 시스템 유형 'x64'가 대상 시스템 유형 'X86'과 충돌


187

CUDA (VC ++, Visual studio 2008sp1)를 사용하여 FEM 프로그램을 디버깅하고 있습니다. cuda가 부족하기 때문에 Win32 플랫폼에서만 프로그램을 실행할 수 있습니다. 링크 된 라이브러리 파일이 모두 x86 플랫폼에서 컴파일 된 것으로 생각하지만 컴파일 할 때 "치명적 오류 LNK1112 : 모듈 시스템 유형 'x64'가 대상 시스템 유형 'X86'과 충돌합니다"라는 오류 메시지가 표시됩니다.

플랫폼을 x64로 변환하려고 시도했지만 작동하지 않았습니다. "모듈 머신 유형"이란 무엇이며 "대상 머신 유형"은 무엇입니까? 어떻게 극복 할 수 있습니까?

답변:


262

나는 이 미친 문제에 직면하여 이것에 관한 블로그 항목을 작성 하고 마침내 시스템을 작동 상태로 되돌려 놓았습니다.

다음 순서대로 확인해야합니다.

  1. 속성> 구성 속성> 링커> 고급> 대상 시스템에서 링커 설정의 속성 옵션을 확인하십시오. 64 비트 빌드를 대상으로하는 경우 MachineX64를, 32 비트 빌드를 작성하는 경우 MachineX86을 선택하십시오.

  2. Visual Studio의 기본 메뉴에서 빌드> 구성 관리자를 선택하십시오. 프로젝트에 올바른 플랫폼이 지정되어 있는지 확인하십시오. IDE는 x64를 빌드하도록 설정 될 수 있지만 솔루션의 개별 프로젝트는 win32를 대상으로 설정 될 수 있습니다. 예, 비주얼 스튜디오는 자신을 걸기 위해 많은 밧줄을 남기지 만 그게 인생입니다.

  3. 라이브러리 파일이 실제로 대상 플랫폼 유형인지 확인하십시오. Visual Studio VC \ bin 디렉토리에있는 dumpbin.exe를 사용하여 사용할 수 있습니다. -headers 옵션을 사용하여 모든 기능을 덤프하십시오. 각 기능에 대한 기계 항목을 찾으십시오. 64 비트 빌드 인 경우 x64를 포함해야합니다.

  4. Visual Studio의 기본 메뉴에서 도구> 옵션을 선택하십시오. 프로젝트 및 솔루션> VC ++ 디렉토리를 선택하십시오. 플랫폼 드롭 다운에서 x64를 선택하십시오. 첫 번째 항목이 $ (VCInstallDir) \ bin \ x86_amd64이고 뒤에 $ (VCInstallDir) \ bin 이 있는지 확인하십시오 .

4 단계를 마치면 모든 것이 다시 작동했습니다. 64 비트 대상으로 컴파일하려는 모든 프로젝트 에서이 문제가 발생했습니다.


6
생명의 은인. 또한 4 단계에서 "라이브러리 디렉토리"도 64 비트 경로로 업데이트해야합니다
Gregory

37
Visual Studio 2013을 사용하는 사용자의 경우 4 단계가 더 이상 사용되지 않습니다. 이제 프로젝트 속성-> 구성 속성-> VC ++ 디렉토리-라이브러리 디렉토리
PolyMesh

3
x86으로 컴파일 된 외부 라이브러리를 사용하는 경우에도이 오류가 발생합니다. Google Test 라이브러리를 사용하여 프로젝트를 빌드하려고 할 때 문제가 발생했습니다.
kayleeFrye_onDeck

3
프로젝트 파일이없는 경우 (Makefile에서 nmake를 실행하는 경우) 어떻게해야합니까?
user118967

3
GUI 버전에서 프로젝트를 작성하는 대신 명령 행에서 어떻게이를 수행 할 수 있습니까?
repzero

152

C Johnson 목록 외에도 다음 사항을 추가합니다.

Visual Studio에서 확인하십시오.
프로젝트 속성-> 구성 속성-> 링커-> 명령 줄.

"추가 옵션"은 포함하지 않아야합니다 /machine:X86

CMake 출력에 의해 생성 된 이러한 키가 있습니다 .CMake 는 x86 프로젝트를 생성 한 다음 Configuration ManagerVisual Studio 2010을 통해 x64 플랫폼을 추가 했습니다. 링커 명령 행을 /machine:X86별도로 지정하지 않고 모든 것이 새 플랫폼에 적합하게 생성되었습니다 .


20
이것은 정확히 내 문제였습니다! 그러나 CMake에서 생성 한 Visual Studio 2017 프로젝트로 구성 관리자를 사용하여 x64 플랫폼 빌드 구성 (Win32 빌드 구성을 복사하여 x64 빌드 구성을 생성 한 위치)을 만들었습니다. "모든 옵션-> 추가 옵션"과 "고급-> 대상 시스템"사이의 링커 "/ MACHINE :"설정이 충돌합니다. 수정하려면 "모든 옵션-> 추가 옵션"-> "/ MACHINE :"설정을 삭제하십시오.
BoiseBaked

2
이것은 아마 시간을 절약했습니다. 감사!
rsp1984

3
이것은 나를위한 수정 이었기 때문에 그냥 고맙다고 말하고 싶었습니다. 이상하게도 이미 upvoted 했으므로 같은 문제로 전에 여기에 있었어야합니다! :)
Adam Dempsey

1
이 솔루션의 약간의 변형 : 내 솔루션의 일부 프로젝트에는 구성 특성에 "링커"가 없습니다. 대신 그들은 "사서"를 가지고 있습니다. 이 경우 실제로 Librarian-> 모든 옵션-> 추가 옵션은 / machine : x86이고 Librarian-> 모든 옵션-> 대상 시스템은 / machine : x64입니다. Librarian-> All Options-> Additional Options ...에서 x86을 삭제하고 마침내 빌드하고 연결했습니다.
제니 얼

이 팁에 감사드립니다. CMake 사용자에게는 일반적인 문제인 것 같습니다. 투표하십시오.
Hao Xi

54

VS2003에서 변환 된 프로젝트에 X64 빌드를 추가하려고 할 때 VS2008에서 동일한 문제가 발생했습니다.

Google 에서이 오류를 검색 할 때 발견 된 모든 것을 보았습니다 (대상 시스템, VC ++ 디렉토리, 덤프 ....). 모든 것이 정상으로 보였습니다.

마지막으로 새로운 테스트 프로젝트를 만들고 동일한 변경 작업을 수행하여 작동하는 것 같습니다.

vcproj 파일 사이의 차이점을 확인하면 문제가 드러났습니다 ....

변환 된 프로젝트에는 링커-> 명령 줄에서 / MACHINE : i386이 추가 옵션으로 설정되어 있습니다. 따라서 두 개의 / MACHINE 옵션 세트 (x64 및 i386 모두)가 있었고 추가 옵션이 선호되었습니다.

이것을 제거하고 링커-> 고급-> 대상 머신에서 올바르게 설정하면 문제가 사라졌습니다.


8
이것은 내 문제이기도했지만 CMake를 사용하여 만든 Visual Studio 솔루션에서 나왔습니다. CMake 가이 옵션도 추가하는 것처럼 보입니다.
Nick Chadwick

4
CMake 프로젝트에서 왔으며이 옵션이 추가되었는지 확인할 수 있습니다.
BeeOnRope 2016 년

25

모든 프로젝트 설정이 완벽 해 보였지만 여전히 오류가 발생했습니다. .vcxproj파일을 살펴보고 "x86"을 검색하면 문제가 발견되었습니다.

<Lib>
  <AdditionalOptions> /machine:X86 %(AdditionalOptions)</AdditionalOptions>
</Lib>

모든 발생 (10 개의 개별 파일 설정)에 대한 빠른 검색 / 바꾸기가 문제를 해결했습니다.


3
또한 프로젝트 속성-> 구성 옵션-> 사서-> 모든 옵션-> 추가 옵션에서.
제니 얼

13

컴파일 및 대상 시스템 사양 (x86 및 x64)의 차이로 인해 문제가 발생하므로 다음 단계를 수행하십시오.

  1. 구성하려는 C ++ 프로젝트를여십시오.
  2. 구성 관리자 버튼을 선택하여 구성 관리자 대화 상자를 엽니 다.
  3. 활성 솔루션 플랫폼 드롭 다운 목록에서 새 솔루션 플랫폼 대화 상자를 여는 옵션을 선택하십시오.
  4. 유형 또는 새 플랫폼 드롭 다운 목록에서 64 비트 플랫폼을 선택하십시오.

내 문제를 해결했습니다.


12

x86을 대상으로하는 x64 (대상 시스템 유형)를 대상으로하는 하나의 .OBJ 또는 .LIB 파일이있을 수 있습니다.

.OBJ 파일에서 DUMPBIN / HEADERS를 사용하고 FILE HEADER VALUES 블록에서 시스템 항목을 확인하십시오.


3
이 오류 메시지가 나타 났을 때 이것이 근본 원인이었습니다. 나는 이전에 하나의 아키텍처를 구축했으며 이전 빌드에서 오브젝트 파일과 라이브러리를 올바르게 정리하지 않았습니다. 이전 빌드에서 이전 .obj 및 .lib 파일을 모두 삭제 한 후 새 아키텍처로 프로젝트를 컴파일 할 수있었습니다.
Ben

이것은 내 문제 였고 대상 아키텍처를 변경할 때 구축하기 전에 솔루션을 정리해야했습니다.

7

Visual Studio 2012 +/-에서 "Configuration Properties'.Linker."Command Line "의 속성 페이지에는"Additional Options "라는 상자가 포함되어 있습니다. x64를 빌드하는 경우 상자에 / MACHINE이 포함되어 있지 않은지 확인하십시오. I386. 프로젝트에서 문제가 발생했습니다.


4

QT를 만들 때이 문제가 발생했습니다. 어딘가에서 읽은 지시 사항은 VS 명령 프롬프트를 사용하여 nmake를 구성하도록 제안했습니다.

x64 명령 프롬프트를 선택하고 많은 번거 로움없이 구성을 수행했습니다. nmake를 시도했을 때이 오류가 발생했습니다.

일부 구성 요소는 32 비트 용으로 사전 구축 된 것 같습니다. 이 오류는 x86 용으로 작성된 모듈도보고했습니다.

32 비트 기본 VS 명령 프롬프트를 사용했으며 작동했습니다.


4
이것은 나를 올바른 길로 인도했습니다. 64 비트 용으로 빌드하는 경우이 Windows 바로 가기를 사용하여 환경을 설정할 수 있습니다. C : \ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat & "C : \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat"x86_amd64 & cd c : \ YourDir 중요한 부분은 x86_amd64입니다. 32 비트 환경으로, qmake는이를 선택합니다.
gremwell

3

Visual Studio 2013에서는

1) 프로젝트 속성 페이지 / 구성 속성 / 링커 / 모든 옵션을 확인하고 잘못 구성된 모든 시스템 및 디렉토리를 수정하십시오.

2) 프로젝트 속성 페이지 / 구성 속성 / 링커 / 입력을 확인하고 잘못 구성된 모든 디렉토리를 수정하십시오.

1의 예 참조)


2

vcxproj 파일은 'MACHINE : i386'을 포함 할 수 있습니다. 편집기로 vcxproj 파일을 편집하십시오. 그것을 제거하십시오!


1
"project property - CUDA Runtime API - GPU - NVCC Compilation Type"

64 비트 컴파일 옵션 설정 -m64 -cubin

힌트는 컴파일 로그에 있습니다. 이처럼 :

nvcc.exe ~~~~~~ -machine 32 -ccbin ~~~~~

그게 "-machine 32"문제 야

먼저 64 비트 컴파일 옵션을 설정 한 후 하이브리드 컴파일 옵션을 다시 설정하십시오. 그럼 당신은 성공을 볼 수 있습니다.


1

솔루션에 lib 프로젝트가있는 경우 특성-> 라이브러리 안-> 일반에서 대상 시스템 특성을 확인하십시오.


1

Jhonson의 목록 외에도 라이브러리의 폴더를 확인하십시오.

Visual Studio의 기본 메뉴에서 도구> 옵션을 선택하십시오. 프로젝트 및 솔루션> VC ++ 디렉토리를 선택하십시오. 플랫폼 드롭 다운에서 x64를 선택하십시오.

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;

1

이것은 여전히 ​​x86 모드에있는 동안 라이브러리 디렉토리를 추가하고 우연히 상속 된 디렉토리를 제거하여 대신 하드 코딩했기 때문에 나에게 일어났습니다. 그런 다음 x64로 전환 한 후에도 내 VC ++ 디렉토리는 다음과 같이 읽습니다.

"...; $ (VC_LibraryPath_x86); $ (WindowsSDK_LibraryPath_x86);"

_x64 대신


감사. 그게 내 문제 야 미래의 리더를 들어, 내 "라이브러리 디렉토리는"지금 읽고$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
플록스 마이다스

1

CMake를 사용하고 win32 구성을 추가했습니다. 속성 페이지에 x86이 표시 되었지만 실제로 텍스트 편집기에서 vcxproj 파일을 열면 x64였습니다! x86으로 수동 변경하면이 문제가 해결되었습니다.


2
나는 비슷한 것을 가졌다. 나는 어떤 설정이 어디에 숨겨져 있는지 알지 못하지만 (대부분의 답변의 조언을 따랐습니다) 그에 따라 생성기를 지정하면 cmake였습니다. -G "Visual Studio 12 Win 64".
user55937

1

매우 실망스럽고 성가신 문제이지만 일단 이해하면 매우 간단합니다. 다른 유형 (예 : x86)의 대상이 되었음에도 불구하고 하나의 아키텍처 유형 (예 : x64)을 빌드하는 요소가 있습니다. ).

충돌을 일으키는 obj 파일을보고 문제의 원인을 찾아서 문제의 원인을 분석 할 수 있습니다. 모든 obj에는 cpp, c, asm 등의 소스 코드 아날로그가 있습니다. 잘못된 도구를 사용하는 특수한 빌드 이벤트가있을 수 있습니다. 속성 시트에서 확인하십시오.

C Johnson의 할 일 목록을 살펴보기 전에 먼저 살펴 보겠습니다.


1

Visual Studio 2013에서 Win32를 * 64로 변경하여이 문제를 해결했습니다.


0

모듈 머신 유형은 컴파일하는 머신이고 대상 머신 유형은 바이너리를 빌드하는 아키텍처 x86 또는 x64입니다.


0

프로젝트 특성-> 구성 특성-> 일반에서 동일한 중간 디렉토리를 갖도록 프로젝트를 설정 한 경우에도이 문제점이 발생할 수 있습니다.


0

우선 다음을 시도하십시오. 1. 구성 관리자로 이동하여 새 x64가 없으면 새로 만듭니다. 2. x64 솔루션을 선택하십시오. 3. 프로젝트 속성으로 이동 한 다음 링커-> 고급 x64 머신을 선택하십시오. 4. 이제 솔루션을 다시 빌드하십시오.

여전히 동일한 오류가 발생합니다. 깨끗한 솔루션을 시도한 다음 다시 빌드하고 Visual Studio를 열면 최근에 열린 프로젝트 목록이 표시됩니다. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 제거하십시오. 이제 솔루션으로 이동하여 솔루션을 다시여십시오.


0

VS2008 솔루션을 VS2010으로 변환하고 win32 구성을 X64로 변경하면 이전 솔루션에서 mfcs90d.lib (구성-> 링커-> 입력-> 추가 종속성)가 있는데 VS010을 사용하고 있기 때문에 방금 확인했습니다. mfcs100d.lib 인 VS2010 폴더에서 (Configuration-> Linker-> Input-> Additional dependencies)에서 mfcs90d.lib를 mfcs100d.lib로 변경하면 정상적으로 작동합니다.


0

QT Creator를 사용하는 사람들의 경우 문제는 동일합니다 (@ c-johnson에서 설명). 키트에서 MSVC의 컴파일러 설정이 아래 표시된대로 x86으로 설정되어 있는지 확인하십시오.

MSVC x86 컴파일러에 대한 QT Creator 키트 설정


0

일부 명령 프롬프트 (dos 프롬프트)를 사용하면 도움이 될 수 있습니다.

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" --help
Error in script usage. The correct usage is:
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option]
  or
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] store
  or
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] [version number]
  or
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] store [version number]
where [option] is: x86 | amd64 | arm | x86_amd64 | x86_arm | amd64_x86 | amd64_arm
where [version number] is either the full Windows 10 SDK version number or "8.1" to use the windows 8.1 SDK
:
The store parameter sets environment variables to support
  store (rather than desktop) development.
:
For example:
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_arm store
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64 10.0.10240.0
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_arm store 10.0.10240.0
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 8.1
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 store 8.1
:
Please make sure either Visual Studio or C++ Build SKU is installed.

또한 당신이 이것을 좋아한다면 :

CL "% 1 % 2 % 3"/ EHsc / link user32.lib Gdi32.lib Winmm.lib comctl32.lib * .obj / SUBSYSTEM : CONSOLE / MACHINE : x86

당신은에있는 델 * .OBJ 전에 ; 이전 컴파일에서 남겨진 64 및 32 비트 객체와 링커를 혼동하지 않으려면?


0

위의 많은 좋은 제안.

또한 x86 Win32로 빌드하려는 경우 :

Program Files (x86)에서 링크하는 라이브러리가 반드시 x86 라이브러리인지 확인하십시오.

예를 들어 C : \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ SDK에 링크 된 lib 파일에서이 오류가 발생하여 결국 C : \ Program Files (x86) \ Windows에서 x86 버전을 찾았습니다. Kits \ 10 \ Lib \ 10.0.18362.0 \ um \ x86 및 모든 것이 잘 작동했습니다.


-1

OS 란 무엇입니까? 그것이 Windows x64 인 경우 CUDA x64가 설치되어 VS2008이 x64 모드에서 프로젝트를 컴파일 해야하는지 확인해야합니다 ...

CUDA는 Windows에만 x64 또는 x86을 설치합니다


빌드하고 링크를 시도 할 때 오류 인 것 같습니다. 기본적으로 빌드 설정에서 불일치 또는 불일치; 다양한 빌드 단계에 대한 매개 변수로 지정할 수있는 대상 플랫폼이 일치하지 않습니다.
Shammi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.