lỗi nghiêm trọng LNK1112: loại máy mô-đun 'x64' xung đột với loại máy đích 'X86'


187

Tôi đang sử dụng CUDA (VC ++, Visual studio 2008sp1) để gỡ lỗi chương trình FEM. Chương trình chỉ có thể chạy trên nền tảng Win32, vì sự thiếu hụt của cuda. Tôi nghĩ rằng tất cả các tệp thư viện được liên kết đều được biên dịch trên nền tảng x86, nhưng khi tôi biên dịch nó, tôi nhận được thông báo lỗi "lỗi nghiêm trọng LNK1112: loại máy mô-đun 'x64' xung đột với loại máy đích 'X86'".

Tôi đã cố gắng chuyển đổi nền tảng thành x64, nhưng nó không hoạt động. Xin vui lòng cho tôi biết: "loại máy mô-đun" là gì và "loại máy mục tiêu" là gì? Làm thế nào tôi có thể vượt qua nó?

Câu trả lời:


261

Tôi đã viết một mục blog về điều này, khi tôi gặp phải vấn đề điên rồ này, và cuối cùng đã đưa hệ thống của tôi trở lại hoạt động.

Đây là những điều cần kiểm tra, theo thứ tự này:

  1. Kiểm tra các tùy chọn thuộc tính của bạn trong cài đặt trình liên kết của bạn tại: Thuộc tính> Thuộc tính cấu hình> Trình liên kết> Nâng cao> Máy đích. Chọn MachineX64 nếu bạn đang nhắm mục tiêu bản dựng 64 bit hoặc MachineX86 nếu bạn đang tạo bản dựng 32 bit.

  2. Chọn Build> Trình quản lý cấu hình từ menu chính trong studio trực quan. Hãy chắc chắn rằng dự án của bạn có nền tảng chính xác được chỉ định. IDE có thể được thiết lập để xây dựng x64 nhưng một dự án riêng lẻ trong giải pháp có thể được đặt thành mục tiêu win32. Vì vậy, yeah, studio hình ảnh để lại rất nhiều dây để treo mình, nhưng đó là cuộc sống.

  3. Kiểm tra các tệp thư viện của bạn rằng chúng thực sự thuộc loại nền tảng đang nhắm mục tiêu. Điều này có thể được sử dụng bằng cách sử dụng dumpbin.exe trong thư mục VC \ bin của studio trực quan của bạn. sử dụng tùy chọn tiêu đề để kết xuất tất cả các chức năng của bạn. Tìm kiếm các mục nhập máy cho từng chức năng. nó sẽ bao gồm x64 nếu đó là bản dựng 64 bit.

  4. Trong studio trực quan, chọn Công cụ> Tùy chọn từ menu chính. chọn Dự án và Giải pháp> Thư mục VC ++. Chọn x64 từ danh sách Nền tảng. Đảm bảo rằng mục nhập đầu tiên là: $ (VCInstallDir) \ bin \ x86_amd64 theo sau là $ (VCInstallDir) \ bin .

Khi tôi đã làm bước 4, mọi thứ lại hoạt động với tôi. Vấn đề là tôi đã gặp phải vấn đề này trên tất cả các dự án của mình, nơi tôi muốn biên dịch theo mục tiêu 64 bit.


6
Cứu người. Cũng trong bước 4, "Thư mục thư viện" cũng cần được cập nhật lên các đường dẫn 64 bit
Gregory

37
Đối với những người sử dụng Visual Studio 2013 - bước 4 đã không được chấp nhận, giờ đây bạn thực hiện thay đổi trong thuộc tính dự án -> thuộc tính cấu hình -> Thư mục VC ++ - Thư mục thư viện
PolyMesh

3
Nếu bạn đang sử dụng thư viện bên ngoài được biên dịch là x86, bạn cũng sẽ gặp lỗi này. Tôi gặp phải nó khi cố gắng xây dựng một dự án bằng libs Google Test.
kayleeFrye_onDeck

3
Nếu tôi không có tệp dự án (chạy nmake trên Makefile), làm thế nào để tôi làm điều tương tự?
dùng118967

3
Làm thế nào bạn có thể làm điều này trên dòng lệnh thay vì tạo một dự án trong phiên bản GUI?
repzero

152

Ngoài danh sách C Johnson tôi sẽ thêm điểm sau:

Kiểm tra trong Visual Studio:
Thuộc tính dự án -> Thuộc tính cấu hình -> Trình liên kết -> Dòng lệnh.

"Tùy chọn bổ sung" KHÔNG nên chứa /machine:X86

Tôi có khóa như vậy, được tạo bởi đầu ra CMake: CMake tạo dự án x86, sau đó tôi đã thêm nền tảng x64 thông qua Configuration Managertrong Visual Studio 2010 - mọi thứ đều được tạo tốt cho nền tảng mới ngoại trừ dòng lệnh liên kết, được chỉ định /machine:X86riêng.


20
Đây chính xác là vấn đề của tôi! Nhưng đó là một dự án Visual Studio 2017 do CMake tạo ra, nơi tôi đã sử dụng Trình quản lý cấu hình để tạo cấu hình xây dựng nền tảng x64 (nơi cấu hình bản dựng Win32 được sao chép để tạo cấu hình bản dựng x64). Điều gì xảy ra là các cài đặt "/ MÁY:" của Trình liên kết giữa xung đột "Tất cả tùy chọn-> Tùy chọn bổ sung" và "Nâng cao-> Máy đích". Để khắc phục, chỉ cần xóa cài đặt "Tất cả tùy chọn-> Tùy chọn bổ sung" -> "/ MÁY:".
BoiseBakes

2
Điều này có lẽ đã giúp tôi tiết kiệm hàng giờ. Cảm ơn!
rsp1984

3
Đây là bản sửa lỗi cho tôi vì vậy tôi chỉ muốn nói lời cảm ơn, thật kỳ lạ là tôi đã nâng cấp nên tôi phải ở đây trước đây với cùng một vấn đề! :)
Adam Dempsey

1
Biến thể nhẹ của giải pháp này: Một số dự án trong giải pháp của tôi không có "Trình liên kết" trong Thuộc tính cấu hình. Thay vào đó họ có "Thủ thư". Trong những trường hợp đó, thực sự Thủ thư -> Tất cả tùy chọn -> Tùy chọn bổ sung đã nói / máy: x86 trong khi Thủ thư -> Tất cả tùy chọn -> Máy đích đã nói / máy: x64. Tôi đã xóa x86 khỏi Thủ thư -> Tất cả tùy chọn -> Tùy chọn bổ sung ... và cuối cùng mọi thứ được xây dựng và liên kết.
Xenial

Cảm ơn những lời khuyên này. Nó dường như là một vấn đề phổ biến cho người dùng CMake. Lên phiếu.
Hao Xi

54

Tôi đã gặp vấn đề tương tự trong VS2008 khi tôi cố gắng thêm bản dựng X64 vào dự án được chuyển đổi từ VS2003.

Tôi đã xem xét mọi thứ được tìm thấy khi tìm kiếm lỗi này trên Google (Máy đích, Thư mục VC ++, DUMPBIN ....) và mọi thứ đều ổn.

Cuối cùng tôi đã tạo ra một dự án thử nghiệm mới và thực hiện các thay đổi tương tự và nó dường như hoạt động.

Làm một khác biệt giữa các tập tin vcproj đã tiết lộ vấn đề ....

Dự án đã chuyển đổi của tôi có / MÁY: i386 được đặt làm tùy chọn bổ sung được đặt trong Trình liên kết-> Dòng lệnh. Do đó, có hai tùy chọn / MÁY được đặt (cả x64 và i386) và tùy chọn bổ sung được ưu tiên.

Xóa cái này và đặt nó đúng cách trong Linker-> Advanced-> Target Machine làm cho vấn đề biến mất.


8
Đây cũng chính xác là vấn đề của tôi - Nhưng điều này xuất phát từ một giải pháp Visual Studio được tạo bằng CMake. Có vẻ như CMake cũng thích thêm tùy chọn này.
Nick Chadwick

4
Tôi đến từ một dự án CMake và có thể xác nhận nó đã thêm tùy chọn này.
BeeOnRope

25

Tất cả các thiết lập dự án có vẻ hoàn hảo, nhưng tôi vẫn gặp lỗi. Nhìn vào .vcxprojtệp và tìm kiếm "x86" đã tiết lộ vấn đề:

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

Tìm kiếm nhanh / thay thế cho tất cả các lần xuất hiện (mười cài đặt tệp riêng lẻ) đã khắc phục sự cố.


3
Ngoài ra trong Thuộc tính dự án -> Tùy chọn cấu hình -> Thủ thư -> Tất cả tùy chọn -> Tùy chọn bổ sung.
Xenial

13

Vì sự cố là do sự khác biệt trong quá trình biên dịch và thông số kỹ thuật của máy đích (x86 & x64) Thực hiện theo các bước bên dưới:

  1. Mở dự án C ++ mà bạn muốn cấu hình.
  2. Chọn nút Trình quản lý cấu hình để mở hộp thoại Trình quản lý cấu hình.
  3. Trong danh sách thả xuống Nền tảng giải pháp hoạt động, chọn tùy chọn để mở hộp thoại Nền tảng giải pháp mới.
  4. Trong Loại hoặc chọn danh sách thả xuống nền tảng mới, chọn nền tảng 64 bit.

Nó giải quyết vấn đề của tôi.


12

Bạn có thể có một tệp .OBJ hoặc .LIB được nhắm mục tiêu cho x64 (đó là loại máy mô-đun) trong khi bạn đang liên kết cho x86 (đó là loại máy mục tiêu).

Sử dụng DUMPBIN / Headers trên các tệp .OBJ của bạn và kiểm tra mục nhập máy trong khối GIÁ TRỊ TẬP TIN FILE.


3
Đây là nguyên nhân gốc rễ đối với tôi khi tôi gặp thông báo lỗi này. Trước đây tôi đã xây dựng cho một kiến ​​trúc và đã không dọn sạch các tệp đối tượng và lib từ bản dựng trước đó. Sau khi xóa tất cả các tệp .obj và .lib cũ khỏi bản dựng trước đó, tôi đã có thể biên dịch dự án của mình với kiến ​​trúc mới.
Ben

Đây là vấn đề của tôi và giải pháp là làm sạch trước khi xây dựng khi thay đổi kiến ​​trúc mục tiêu.

7

Trong Visual Studio 2012 +/-, trang thuộc tính cho "Thuộc tính cấu hình'.Linker." Dòng lệnh "chứa một hộp có nhãn" Tùy chọn bổ sung ". Nếu bạn đang xây dựng x64, hãy đảm bảo rằng hộp đó không chứa / MÁY: I386. Các dự án của tôi đã làm và nó tạo ra lỗi trong câu hỏi.


4

Tôi đã gặp vấn đề này khi xây dựng QT. Các hướng dẫn tôi đọc được ở đâu đó gợi ý rằng tôi định cấu hình nmake bằng dấu nhắc lệnh VS.

Tôi đã chọn dấu nhắc lệnh x64 và thực hiện cấu hình mà không gặp nhiều rắc rối. Khi tôi thử nmake, nó đã báo lỗi này.

Tôi nghĩ rằng một số thành phần đã được xây dựng trước cho 32-bit. Lỗi thậm chí báo cáo mô-đun nào được xây dựng cho x86.

Tôi đã sử dụng dấu nhắc lệnh VS mặc định 32 bit và nó đã hoạt động.


4
Điều này đưa tôi đi đúng hướng. Nếu bạn đang xây dựng 64 bit, bạn có thể sử dụng phím tắt windows này để thiết lập môi trường của mình: C: \ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat & "C: \ Chương trình tập tin (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat" x86_amd64 & cd c: \ YourDir Phần quan trọng về điều đó là x86_amd64 - mà không có môi trường được đặt lên như một môi trường 32 bit và qmake chọn nó như vậy.
gremwell

3

Trong Visual Studio 2013,

1) Kiểm tra Trang thuộc tính dự án / Thuộc tính cấu hình / Trình liên kết / Tất cả tùy chọn và sửa tất cả các thư mục và máy được cấu hình sai.

2) Kiểm tra các trang thuộc tính dự án / Thuộc tính cấu hình / Trình liên kết / Nhập và sửa tất cả các thư mục được cấu hình sai.

Xem ví dụ về 1)


2

Tệp vcxproj có thể chứa 'MÁY: i386' Chỉnh sửa tệp vcxproj bằng trình chỉnh sửa. xóa nó !


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

Đặt tùy chọn biên dịch 64 bit -m64 -cubin

Gợi ý là tại nhật ký biên dịch. Như thế này:

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

Đó "-machine 32"là vấn đề.

Đầu tiên thiết lập tùy chọn biên dịch 64 bit, tiếp theo thiết lập lại tùy chọn biên dịch lai. Sau đó bạn có thể thấy thành công.


1

Nếu giải pháp của bạn có các dự án lib, hãy kiểm tra thuộc tính Máy mục tiêu trong Thuộc tính-> Thủ thư-> Chung


1

Ngoài danh sách của Jhonson, hãy kiểm tra các thư mục của thư viện

Trong studio trực quan, chọn Công cụ> Tùy chọn từ menu chính. chọn Dự án và Giải pháp> Thư mục VC ++. Chọn x64 từ danh sách Nền tảng.

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

1

Điều này đã xảy ra với tôi ngày hôm nay bởi vì tôi đã thêm một thư mục thư viện khi vẫn ở chế độ x86 và vô tình xóa các thư mục được kế thừa, thay vào đó chúng bị mã hóa cứng. Sau đó, sau khi chuyển sang x64, các Thư mục VC ++ của tôi vẫn đọc:

"...; $ (VC_L LibraryPath_x86); $ (WindowsSDK_L LibraryPath_x86);"

thay vì _x64.


Cảm ơn. Đó là vấn đề của tôi. Đối với độc giả tương lai, "Thư mục thư viện" của tôi hiện đang đọc$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas

1

Tôi đã sử dụng CMake và sau đó thêm một cấu hình win32. Trang thuộc tính hiển thị x86 nhưng thực tế khi mở tệp vcxproj trong trình soạn thảo văn bản thì đó là x64! Thay đổi thủ công thành x86 đã giải quyết điều này.


2
Tôi đã có một cái gì đó tương tự. Tôi không biết cài đặt nào đang ẩn ở đâu (và tôi đã làm theo lời khuyên của hầu hết các câu trả lời ở đây), nhưng chỉ định trình tạo phù hợp đã làm điều đó cho tôi: cmake. -G "Visual Studio 12 Win 64".
dùng55937

1

Đây là một vấn đề rất khó chịu và phiền toái nhưng một khi bạn hiểu nó, nó khá đơn giản: bạn có một số yếu tố trong việc xây dựng một kiểu kiến ​​trúc (trong trường hợp của bạn là x64) mặc dù thực tế đó là mục tiêu cho loại khác (giả sử x86 ).

Bạn có thể phân tích nguồn gốc của vấn đề bằng cách xem tệp obj nào gây ra sự cố và bắt đầu tìm kiếm sự cố ở đó. Mỗi obj sẽ có một mã nguồn tương tự: trong cpp, c, asm, v.v. Có thể có các sự kiện xây dựng đặc biệt xung quanh nó đang sử dụng công cụ sai. Kiểm tra xem trong bảng tài sản.

Tôi sẽ nhìn vào đó trước khi xem qua danh sách những việc cần làm của C Johnson.


1

Tôi đã giải quyết vấn đề này bằng cách thay đổi Win32 thành * 64 trong Visual Studio 2013.


0

loại máy mô-đun là máy bạn đang biên dịch và loại máy đích là kiến ​​trúc x86 hoặc x64 mà bạn đang xây dựng nhị phân của mình.


0

Vấn đề này cũng có thể xảy ra nếu dự án của bạn được thiết lập có cùng thư mục trung gian trong Thuộc tính dự án -> Thuộc tính cấu hình -> Chung


0

Trước hết hãy thử những điều sau: 1. Trình quản lý cấu hình goto và tạo x64 mới nếu nó chưa có. 2. chọn giải pháp x64. 3. đi đến thuộc tính dự án và sau đó Linker-> Advanced chọn máy x64. 4. Bây giờ xây dựng lại giải pháp.

Nếu vẫn còn bạn đang nhận được cùng một lỗi. thử giải pháp sạch và sau đó xây dựng lại và mở studio trực quan, bạn sẽ nhận được danh sách dự án đã mở gần đây, nhấp chuột phải vào dự án và xóa nó khỏi đó. Bây giờ đi đến giải pháp và mở lại giải pháp một lần nữa.


0

điều này xảy ra với tôi khi tôi chuyển đổi giải pháp VS2008 của mình sang VS2010 và thay đổi cấu hình win32 thành X64, trong giải pháp cũ của tôi, tôi có mfcs90d.lib (Cấu hình-> Trình liên kết-> Đầu vào-> Phụ thuộc bổ sung), vì tôi đang sử dụng VS010, tôi vừa kiểm tra trong thư mục VS2010 có mfcs100d.lib, vì vậy tôi đã thay đổi mfcs90d.lib thành mfcs100d.lib trong (Cấu hình-> Trình liên kết-> Đầu vào-> Phụ thuộc bổ sung) nó hoạt động tốt.


0

Đối với những người ở với QT Creator, vấn đề là như nhau (như được mô tả bởi @ c-johnson). Đảm bảo cài đặt trình biên dịch cho MSVC trong bộ của bạn được đặt thành x86 như hiển thị bên dưới.

Cài đặt bộ công cụ QT Creator cho trình biên dịch MSVC x86


0

đối với một số sử dụng dấu nhắc lệnh (nhắc nhở dos) điều này có thể hữu ích:

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.

Ngoài ra nếu bạn làm như thế này:

CL "% 1% 2% 3" / EHsc / liên kết người dùng32.lib Gdi32.lib Winmm.lib comctl32.lib * .obj / SUBSYSTEM: / MÁY: x86

bạn phải del * .obj trước ; để tránh liên kết nhầm lẫn với cả hai đối tượng 64 và 32 bit còn lại từ các phần tổng hợp trước?


0

Nhiều gợi ý hay ở trên.

Ngoài ra nếu bạn đang cố gắng xây dựng trong x86 Win32:

Đảm bảo rằng mọi thư viện bạn liên kết đến trong Tệp chương trình (x86) thực sự là thư viện x86 vì chúng không nhất thiết phải ...

Ví dụ: tệp lib tôi đã liên kết trong C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ SDK đã ném lỗi đó, cuối cùng tôi đã tìm thấy phiên bản x86 của nó trong C: \ Program Files (x86) \ Windows Bộ dụng cụ \ 10 \ Lib \ 10.0.18362.0 \ um \ x86 và mọi thứ đều hoạt động tốt.


-1

HĐH là gì? nếu đó là windows x64 thì bạn cần chắc chắn rằng CUDA x64 đã được cài đặt và do đó VS2008 sẽ biên dịch dự án ở chế độ x64 ...

CUDA sẽ chỉ cài đặt x64 HOẶC x86 trong windows


Đây dường như là một lỗi khi xây dựng và cố gắng liên kết. Về cơ bản, nó không phù hợp hoặc không nhất quán trong cài đặt bản dựng; nền tảng đích có thể được chỉ định làm tham số cho các bước xây dựng khác nhau là không phù hợp.
Shammi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.