kesalahan fatal LNK1112: tipe mesin modul 'x64' konflik dengan tipe mesin target 'X86'

187

Saya menggunakan CUDA (VC ++, Visual studio 2008sp1) untuk men-debug program FEM. Program ini hanya dapat berjalan pada platform Win32, karena kekurangan cuda. Saya pikir file perpustakaan yang ditautkan semuanya dikompilasi pada platform x86, tetapi ketika saya mengkompilasinya, saya mendapatkan pesan kesalahan "kesalahan fatal LNK1112: tipe mesin modul 'x64' konflik dengan tipe mesin target 'X86'".

Saya telah mencoba mengubah platform menjadi x64, tetapi tidak berhasil. Tolong beritahu saya: apa itu "tipe mesin modul" dan apa "tipe mesin target"? Bagaimana saya bisa mengatasinya?

pengguna430382
sumber

Jawaban:

262

Saya menulis entri blog tentang ini, ketika saya menghadapi masalah yang menjengkelkan ini, dan akhirnya menarik sistem saya kembali ke urutan kerja.

Ini adalah hal-hal yang perlu diperiksa, dalam urutan ini:

  1. Periksa opsi properti Anda di pengaturan tautan Anda di: Properti> Properti Konfigurasi> Linker> Tingkat Lanjut> Mesin Target. Pilih MachineX64 jika Anda menargetkan build 64 bit, atau MachineX86 jika Anda membuat build 32 bit.

  2. Pilih Build> Configuration Manager dari menu utama di visual studio. Pastikan proyek Anda memiliki platform yang benar. Dimungkinkan untuk IDE diatur untuk membangun x64 tetapi proyek individu dalam solusi dapat diatur ke target win32. Jadi ya, studio visual meninggalkan banyak tali untuk menggantung diri, tapi itulah kehidupan.

  3. Periksa file perpustakaan Anda apakah itu benar-benar jenis penargetan platform. Ini dapat digunakan dengan menggunakan dumpbin.exe yang ada di direktori VC \ bin visual studio Anda. gunakan opsi-header untuk membuang semua fungsi Anda. Cari entri mesin untuk setiap fungsi. harus menyertakan x64 jika versi 64 bit.

  4. Di studio visual, pilih Peralatan> Pilihan dari menu utama. pilih Proyek dan Solusi> Direktori VC ++. Pilih x64 dari dropdown Platform. Pastikan entri pertama adalah: $ (VCInstallDir) \ bin \ x86_amd64 diikuti oleh $ (VCInstallDir) \ bin .

Setelah saya lakukan langkah 4 semuanya bekerja lagi untuk saya. Masalahnya adalah saya menghadapi masalah ini pada semua proyek saya di mana saya ingin mengkompilasi target 64 bit.

C Johnson
sumber
6
Penolong. Juga di langkah 4, "Direktori Perpustakaan" juga perlu diperbarui ke jalur 64-bit
Gregory
37
Bagi mereka yang menggunakan Visual Studio 2013 - langkah 4 telah ditinggalkan, Anda sekarang membuat perubahan dalam properti proyek -> properti konfigurasi -> Direktori VC ++ - Perpustakaan Direktori
PolyMesh
3
Jika Anda menggunakan perpustakaan eksternal yang dikompilasi sebagai x86, Anda juga akan mendapatkan kesalahan ini. Saya menabraknya ketika mencoba membangun proyek menggunakan Google Test libs.
kayleeFrye_onDeck
3
Jika saya tidak memiliki file proyek (menjalankan nmake di Makefile), bagaimana saya melakukan hal yang sama?
user118967
3
Bagaimana Anda bisa melakukan ini pada baris perintah alih-alih membuat proyek dalam versi GUI?
repzero
152

Selain daftar C Johnson saya akan menambahkan poin berikut:

Periksa di Visual Studio:
Properti Proyek -> Properti Konfigurasi -> Linker -> Baris perintah.

"Opsi Tambahan" TIDAK boleh berisi /machine:X86

Saya memiliki kunci seperti itu, dihasilkan oleh output CMake: CMake menghasilkan proyek x86, kemudian saya menambahkan platform x64 melalui Configuration Managerdalam Visual Studio 2010 - semuanya dibuat baik untuk platform baru kecuali bahwa baris perintah linker, ditentukan /machine:X86secara terpisah.

sergtk
sumber
20
Ini persis masalah saya! Tapi itu adalah proyek Visual Studio 2017 yang dibuat CMake di mana saya menggunakan Configuration Manager untuk membuat konfigurasi platform x64 (di mana konfigurasi build Win32 disalin untuk membuat konfigurasi build x64). Apa yang terjadi adalah bahwa pengaturan "/ MESIN:" tautan antara konflik "Semua Opsi-> Opsi Tambahan" dan "Advanced-> Mesin Target". Untuk memperbaikinya, hapus saja pengaturan "Semua Opsi-> Opsi Tambahan" -> "/ MESIN:".
BoiseBaked
2
Ini mungkin menghemat waktu saya. Terima kasih!
rsp1984
3
Ini adalah perbaikan untuk saya jadi hanya ingin mengucapkan terima kasih, anehnya saya sudah terbalik jadi saya pasti sudah di sini sebelumnya dengan masalah yang sama! :)
Adam Dempsey
1
Varian yang sedikit dari solusi ini: Beberapa proyek dalam solusi saya tidak memiliki "Linker" di Configuration Properties. Sebaliknya mereka memiliki "Pustakawan". Dalam kasus itu, memang Pustakawan -> Semua Pilihan -> Opsi Tambahan berkata / mesin: x86 sementara Pustakawan -> Semua Pilihan -> Mesin Target berkata / mesin: x64. Saya menghapus x86 dari Pustakawan -> Semua Pilihan -> Opsi Tambahan ... dan semuanya akhirnya dibangun dan ditautkan.
Xenial
Terima kasih untuk tips ini. Tampaknya menjadi masalah umum bagi pengguna CMake. Pemungutan suara.
Hao Xi
54

Saya mengalami masalah yang sama di VS2008 ketika saya mencoba menambahkan build X64 ke proyek yang dikonversi dari VS2003.

Saya melihat semua yang ditemukan ketika mencari kesalahan ini di Google (mesin Target, VC ++ Direktori, DUMPBIN ....) dan semuanya tampak OK.

Akhirnya saya membuat proyek pengujian baru dan melakukan perubahan yang sama dan sepertinya berhasil.

Melakukan perbedaan antara file vcproj mengungkapkan masalahnya ....

Proyek saya yang dikonversi memiliki / MESIN: i386 ditetapkan sebagai opsi tambahan yang diatur di bawah Linker-> Command Line. Jadi ada dua / opsi MESIN yang ditetapkan (baik x64 dan i386) dan yang tambahan mengambil preferensi.

Menghapus ini dan mengaturnya dengan benar di bawah Linker-> Advanced-> Target Machine membuat masalah menghilang.

Zid
sumber
8
Ini persis masalah saya juga - Tapi ini datang dari solusi Visual Studio yang dibuat menggunakan CMake. Sepertinya CMake juga suka menambahkan opsi ini.
Nick Chadwick
4
Saya berasal dari proyek CMake dan dapat mengonfirmasinya menambahkan opsi ini.
BeeOnRope
25

Semua pengaturan proyek tampak sempurna, tetapi saya masih mendapatkan kesalahan. Melihat ke dalam .vcxprojfile dan mencari "x86" mengungkapkan masalahnya:

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

Pencarian cepat / ganti untuk semua kejadian (sepuluh pengaturan file individu) memperbaiki masalah.

lama12345
sumber
3
Juga di Properti Proyek -> Opsi Konfigurasi -> Pustakawan -> Semua Pilihan -> Opsi Tambahan.
Xenial
13

Karena masalahnya adalah karena perbedaan dalam kompilasi dan spesifikasi mesin target (x86 & x64) Ikuti langkah-langkah di bawah ini:

  1. Buka proyek C ++ yang ingin Anda konfigurasi.
  2. Pilih tombol Configuration Manager untuk membuka kotak dialog Configuration Manager.
  3. Dalam daftar drop-down Platform Solusi Aktif, pilih opsi untuk membuka kotak dialog Platform Solusi Baru.
  4. Dalam Jenis atau pilih daftar drop-down platform baru, pilih platform 64-bit.

Itu memecahkan masalah saya.

hab
sumber
12

Anda mungkin memiliki satu file .OBJ atau .LIB yang ditargetkan untuk x64 (itulah jenis mesin modul) saat Anda menautkan untuk x86 (itulah jenis mesin target).

Gunakan DUMPBIN / HEADERS pada file .OBJ Anda dan periksa entri mesin di blok FILE HEADER VALUES.

Patrick
sumber
3
Ini adalah penyebab utama bagi saya ketika saya menemukan pesan kesalahan ini. Saya sebelumnya telah membangun untuk satu arsitektur dan belum membersihkan file objek dan lib dengan benar dari build sebelumnya. Setelah menghapus semua file .obj dan .lib lama dari build sebelumnya, saya dapat mengkompilasi proyek saya dengan arsitektur baru.
Ben
Ini adalah masalah saya dan solusinya adalah membersihkan sebelum membangun ketika mengubah arsitektur target.
7

Di Visual Studio 2012 +/-, halaman properti untuk "Properti Konfigurasi'.Linker." Baris Perintah "berisi kotak berlabel" Opsi Tambahan ". Jika Anda sedang membangun x64, pastikan kotak itu tidak mengandung / MESIN: I386. Proyek saya berhasil dan menghasilkan kesalahan yang dipertanyakan.

laloumen
sumber
4

Saya menemukan masalah ini ketika membangun QT. Instruksi yang saya baca di suatu tempat menyarankan agar saya mengkonfigurasi nmake menggunakan command prompt VS.

Saya memilih command prompt x64 dan melakukan konfigurasi tanpa banyak kesulitan. Ketika saya mencoba nmake, itu memberi kesalahan ini.

Saya pikir beberapa komponen sudah pre-built untuk 32-bit. Kesalahan bahkan melaporkan modul mana yang dibangun untuk x86.

Saya menggunakan prompt perintah VS 32 bit standar dan itu berhasil.

pvairam
sumber
4
Ini menempatkan saya di jalur yang benar. Jika Anda membangun 64 bit, Anda dapat menggunakan pintasan windows ini untuk mengatur lingkungan Anda: 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 Bagian penting tentang itu adalah x86_amd64 - tanpa lingkungan diatur sebagai lingkungan 32 bit dan qmake mengambilnya seperti itu.
gremwell
3

Dalam Visual Studio 2013,

1) Periksa di Halaman Properti Proyek / Properti Konfigurasi / Linker / Semua Opsi dan perbaiki semua mesin dan direktori yang dikonfigurasi.

2) Periksa di Halaman Properti Proyek / Properti Konfigurasi / Linker / Input dan perbaiki semua direktori yang tidak dikonfigurasi.

Lihat contoh 1)

fabceolin
sumber
2

file vcxproj dapat berisi 'MACHINE: i386' Edit file vcxproj dengan editor. Singkirkan !

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

Atur opsi kompilasi 64 bit -m64 -cubin

Petunjuknya ada di compile log. Seperti ini:

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

Itu "-machine 32"masalah.

Pertama atur opsi kompilasi 64bit, selanjutnya atur opsi kompilasi hybrid. Maka kamu dapat melihat berhasil.

chang
sumber
1

Jika solusi Anda memiliki proyek Lib, periksa properti Mesin Target di Properti-> Pustakawan-> Umum

Bilas
sumber
1

Selain daftar Jhonson, periksa juga folder perpustakaan

Di studio visual, pilih Peralatan> Pilihan dari menu utama. pilih Proyek dan Solusi> Direktori VC ++. Pilih x64 dari dropdown Platform.

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;
Igor Barbarian
sumber
1

Ini terjadi pada saya hari ini karena saya telah menambahkan direktori perpustakaan saat masih dalam mode x86, dan secara tidak sengaja menghapus direktori yang diwarisi, menjadikannya sebagai hardcode. Kemudian setelah beralih ke x64, Direktori VC ++ saya masih membaca:

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

bukannya _x64.

masterxilo
sumber
Terima kasih. Itu masalah saya. Untuk pembaca masa depan, "Direktori Perpustakaan" saya sekarang berbunyi$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas
1

Saya menggunakan CMake & kemudian menambahkan konfigurasi win32. Halaman properti menunjukkan x86 tetapi sebenarnya ketika membuka file vcxproj di editor teks itu x64! Mengubah secara manual ke x86 menyelesaikan masalah ini.

mendengus
sumber
2
Saya memiliki sesuatu yang serupa. Saya tidak tahu pengaturan apa yang tersembunyi di mana (dan saya mengikuti saran dari sebagian besar jawaban di sini), tetapi menentukan generator yang sesuai melakukannya untuk saya: cmake. -G "Visual Studio 12 Win 64".
user55937
1

Ini adalah masalah yang sangat menyebalkan dan menyebalkan, tetapi begitu Anda memahaminya, itu cukup sederhana: Anda memiliki beberapa elemen di dalam bangunan yang Anda bangun dengan tipe arsitektur satu (dalam kasus Anda x64) meskipun faktanya itu adalah target untuk tipe lain (katakanlah x86 ).

Anda dapat membedah sumber masalah Anda dengan melihat file obj mana yang menyebabkan crash dan mulai mencari masalah di sana. Setiap obj akan memiliki analog kode sumber: baik dalam cpp, c, asm dll. Mungkin ada acara build khusus di sekitarnya yang menggunakan alat yang salah. Periksa itu di lembar properti.

Saya akan mencari di sana terlebih dahulu sebelum membahas daftar hal-hal yang harus dilakukan C Johnson.


sumber
1

Saya memecahkan masalah ini dengan mengubah Win32 ke * 64 di Visual Studio 2013.

Salman Saleh
sumber
0

jenis mesin modul adalah mesin yang Anda kompilasi dan jenis mesin target adalah arsitektur x86 atau x64 yang Anda buat binernya.

djs
sumber
0

Masalah ini juga dapat terjadi jika proyek Anda diatur untuk memiliki direktori perantara yang sama di Properti Proyek -> Properti Konfigurasi -> Umum

Anton K
sumber
0

Pertama-tama cobalah hal-hal berikut: 1. Manajer konfigurasi goto dan buat x64 baru jika belum ada. 2. pilih solusi x64. 3. pergi ke properti proyek dan kemudian Linker-> Advanced pilih mesin x64. 4. Sekarang buat kembali solusinya.

Jika masih Anda mendapatkan kesalahan yang sama. coba solusi bersih dan kemudian bangun kembali dan buka studio visual Anda akan mendapatkan daftar proyek yang baru dibuka, klik kanan pada proyek dan hapus dari sana. Sekarang pergi ke solusi dan buka kembali solusi.

Digvijay Rathore
sumber
0

ini terjadi pada saya ketika saya mengubah solusi VS2008 saya ke VS2010 & mengubah konfigurasi win32 ke X64, dalam solusi lama saya, saya punya mfcs90d.lib (Konfigurasi-> Linker-> Input-> dependensi tambahan), karena saya menggunakan VS010 saya baru saja memeriksa dalam folder VS2010 di mana itu adalah mfcs100d.lib, jadi saya mengubah mfcs90d.lib menjadi mfcs100d.lib di (Konfigurasi-> Tautan-> Input-> Ketergantungan tambahan) berfungsi dengan baik.

NDestiny
sumber
0

Bagi mereka yang bersama QT Creator, masalahnya sama (seperti yang dijelaskan oleh @ c-johnson). Pastikan pengaturan kompiler untuk MSVC di kit Anda diatur ke x86 seperti yang ditunjukkan di bawah ini.

Pengaturan QT Creator Kit untuk kompiler MSVC x86

Jimson Kannanthara James
sumber
0

untuk beberapa yang menggunakan command prompt (dos prompt) ini mungkin bermanfaat:

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.

Juga Jika Anda suka ini:

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

Anda harus del * .obj sebelumnya ; untuk menghindari tautan yang membingungkan dengan objek 64 dan 32 bit yang tersisa dari kompilasi sebelumnya?

kris2k
sumber
0

Banyak saran bagus di atas.

Juga jika Anda mencoba membangun di x86 Win32:

Pastikan bahwa semua pustaka yang Anda tautkan dalam Program Files (x86) sebenarnya adalah pustaka x86 karena belum tentu ...

Misalnya file lib yang saya tautkan dalam C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ SDK melemparkan kesalahan itu, akhirnya saya menemukan versi x86 dalam C: \ Program Files (x86) \ Windows Kit \ 10 \ Lib \ 10.0.18362.0 \ um \ x86 dan semuanya bekerja dengan baik.

GrahamJ
sumber
-1

apa OSnya? jika itu adalah windows x64 maka Anda perlu memastikan bahwa CUDA x64 diinstal dan dengan demikian VS2008 harus mengkompilasi proyek dalam mode x64 ...

CUDA hanya akan menginstal x64 OR x86 di windows

Conor
sumber
Ini tampaknya menjadi kesalahan saat membuat dan mencoba menautkan. Pada dasarnya ini merupakan ketidakcocokan atau ketidakkonsistenan dalam pengaturan build; platform target yang dapat ditentukan sebagai parameter untuk berbagai langkah pembangunan tidak konsisten.
Shammi