önemli hata LNK1112: modül makine tipi 'x64' hedef makine tipi 'X86' ile çakışıyor


187

Bir FEM programında hata ayıklamak için CUDA (VC ++, Visual studio 2008sp1) kullanıyorum. Program sadece bir Win32 platformunda, cuda yetersizliği için çalışabilir. Sanırım bağlı kütüphane dosyaları x86 platformunda derlenmiş, ama derlemek zaman, "önemli hata LNK1112: modül makine türü 'x64' hedef makine türü 'X86' ile çakışıyor" hata iletisini alıyorum.

Platformu x64'e dönüştürmeye çalıştım, ama işe yaramadı. Lütfen söyle: "modül makine tipi" nedir ve "hedef makine tipi" nedir? Nasıl üstesinden gelebilirim?

Yanıtlar:


262

Bu çılgınlıkla ilgili sorunla karşılaştığımda bununla ilgili bir blog yazısı yazdım ve sonunda sistemimi tekrar çalışma düzenine çektim.

Bunlar şu sırayla kontrol edilecek şeyler:

  1. Bağlayıcı ayarlarınızdaki özellikler seçeneklerinizi kontrol edin: Özellikler> Yapılandırma Özellikleri> Bağlayıcı> Gelişmiş> Hedef Makine. 64 bitlik bir yapı hedefliyorsanız MachineX64'ü veya 32 bitlik bir yapı oluşturuyorsanız MachineX86'yı seçin.

  2. Visual Studio'daki ana menüden Oluştur> Yapılandırma Yöneticisi'ni seçin. Projenizin doğru platformun belirtildiğinden emin olun. IDE'nin x64 oluşturmak için ayarlanması mümkündür, ancak çözümdeki bireysel bir proje win32'yi hedef alacak şekilde ayarlanabilir. Yani evet, görsel stüdyo kendini asmak için çok fazla ip bırakıyor, ama bu hayat.

  3. Kütüphane dosyalarınızın, gerçekten hedeflediğiniz platform türünde olduklarını kontrol edin. Bu, visual studio VC \ bin dizininizdeki dumpbin.exe aracını kullanarak kullanılabilir. tüm işlevlerinizi boşaltmak için -headers seçeneğini kullanın. Her işlev için makine girişini arayın. 64 bit derlemeyse x64 içermelidir.

  4. Visual studio'da, ana menüden Araçlar> Seçenekler'i seçin. Projeler ve Çözümler> VC ++ Dizinleri'ni seçin. Platform açılır menüsünden x64'ü seçin. İlk girişin: $ (VCInstallDir) \ bin \ x86_amd64 ve ardından $ (VCInstallDir) \ bin olduğundan emin olun .

Adım 4 yaptıktan sonra her şey benim için tekrar çalıştı. Mesele şu ki, 64 bitlik bir hedefe ulaşmak istediğim tüm projelerimde bu problemle karşılaşıyordum.


6
Hayat kurtarıcı. Ayrıca 4. adımda, "Kütüphane Dizinlerinin" 64 bit yollara da güncellenmesi gerekir
Gregory

37
Visual Studio 2013 kullananlar için - 4. adım kullanımdan kaldırıldı, şimdi proje özelliklerinde -> yapılandırma özelliklerinde -> VC ++ Dizinleri - Kütüphane Dizinleri
PolyMesh

3
X86 olarak derlenen harici bir kitaplık kullanıyorsanız, bu hatayı da alırsınız. Google Test kütüphanelerini kullanarak bir proje oluşturmaya çalışırken karşılaştım.
kayleeFrye_onDeck

3
Bir proje dosyam yoksa (Makmakile'de nmake çalıştıran), aynı şeyi nasıl yapabilirim?
user118967

3
GUI sürümünde proje oluşturmak yerine bunu komut satırında nasıl yapabilirsiniz?
repzero

152

C Johnson listesine ek olarak aşağıdaki noktayı eklerim:

Visual Studio'da denetleyin:
Proje Özellikleri -> Yapılandırma Özellikleri -> Bağlayıcı -> Komut satırı.

"Ek Seçenekler" İÇERMEMELİDİR /machine:X86

CMake çıktı tarafından oluşturulan böyle bir anahtar var: CMake oluşturulan x86 projesi, sonra Configuration ManagerVisual Studio 2010'da x64 platformu ekledim - /machine:X86ayrı ayrı belirtilen bağlayıcı komut satırı dışında her şey yeni platform için iyi oluşturuldu .


20
Bu benim sorunumdu! Ancak bu, x64 platform derlemesi yapılandırmaları oluşturmak için Configuration Manager'ı kullandığım (Win32 derleme yapılandırmalarının x64 derleme yapılandırmaları oluşturmak için kopyalandığı) CMake tarafından oluşturulan bir Visual Studio 2017 projesiydi. Ne olur, Bağlayıcı "/ MACHINE:" ayarları "Tüm Seçenekler-> Ek Seçenekler" ve "Gelişmiş-> Hedef Makine" çakışmasıdır. Düzeltmek için "Tüm Seçenekler-> Ek Seçenekler" -> "/ MAKİNE:" ayarını silin.
BoiseBaked

2
Bu muhtemelen bana saatler kazandırdı. Teşekkürler!
rsp1984

3
Bu benim için düzeltme öyleydi, sadece teşekkür etmek istedim, garip bir şekilde zaten kaldırılmıştı, bu yüzden burada aynı sorunla daha önce olmalıydım! :)
Adam Dempsey

1
Bu çözümün hafif değişkeni: Çözümümdeki bazı projelerin Yapılandırma Özellikleri'nde "Bağlayıcı" yoktur. Bunun yerine "Kütüphaneci" var. Bu durumlarda, gerçekten Kütüphaneci -> Tüm Seçenekler -> Ek Seçenekler dedi / makine: x86 ise Kütüphaneci -> Tüm Seçenekler -> Hedef Makine dedi / makine: x64. X86'yı Kütüphaneciden sildim -> Tüm Seçenekler -> Ek Seçenekler ... ve nihayet inşa edilmiş ve bağlantılı şeyler.
Xenial

Bu ipuçları için teşekkürler. CMake kullanıcıları için yaygın bir sorun gibi görünüyor. Yukarı oy.
Hao Xi

54

VS2003'ten dönüştürülen bir projeye bir X64 derlemesi eklemeye çalıştığımda VS2008'de de aynı sorunu yaşadım.

Google'da (Hedef makine, VC ++ Dizinleri, DUMPBIN ....) bu hatayı ararken bulunan her şeye baktım ve her şey yolunda görünüyordu.

Sonunda yeni bir test projesi oluşturdum ve aynı değişiklikleri yaptım ve işe yaradı.

Vcproj dosyaları arasında fark yapmak sorunu ortaya çıkardı ....

Dönüştürülen projem / MACHINE: i386, Bağlayıcı-> Komut Satırı altında ek seçenek olarak ayarlandı. Böylece iki / MACHINE seçeneği ayarlandı (hem x64 hem de i386) ve ek seçenek tercih edildi.

Bunu kaldırmak ve Bağlayıcı-> Gelişmiş-> Hedef Makinesi altında düzgün şekilde ayarlamak sorunu ortadan kaldırdı.


8
Bu da benim sorunumdu - Ama bu CMake kullanılarak oluşturulan bir Visual Studio çözümünden geldi. Görünüşe göre CMake bu seçeneği de eklemeyi seviyor.
Nick Chadwick

4
Bir CMake projesinden geldim ve bu seçeneği eklediğini onaylayabilirim.
BeeOnRope

25

Tüm proje ayarları mükemmel görünüyordu, ama yine de hatayla karşılaştım. İçine bakıyor .vcxproj"x86" için dosyası ve arama sorunu ortaya koymuştur:

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

Tüm olaylar için hızlı bir arama / değiştirme (on ayrı dosya ayarı) sorunu çözdü.


3
Ayrıca Proje Özellikleri -> Yapılandırma Seçenekleri -> Kütüphaneci -> Tüm Seçenekler -> Ek Seçenekler'de.
Xenial

13

Sorun, derleme ve hedef makine özellikleri (x86 ve x64) arasındaki farktan kaynaklandığından aşağıdaki adımları izleyin:

  1. Yapılandırmak istediğiniz C ++ projesini açın.
  2. Configuration Manager iletişim kutusunu açmak için Configuration Manager düğmesini seçin.
  3. Etkin Çözüm Platformu açılır listesinde Yeni Çözüm Platformu iletişim kutusunu açma seçeneğini seçin.
  4. Yeni platform yazın veya seçin açılır listesinde bir 64 bit platform seçin.

Sorunumu çözdü.


12

X86 için bağlanırken muhtemelen x64 için hedeflenen bir .OBJ veya .LIB dosyanız (modül makine türü budur) (hedef makine türü budur).

.OBJ dosyalarınızda DUMPBIN / HEADERS kullanın ve FILE HEADER VALUES bloğundaki makine girişini kontrol edin.


3
Bu hata iletisiyle karşılaştığımda bu benim için temel nedendi. Daha önce bir mimari için inşa etmiştim ve nesne dosyalarını ve kütüphaneleri önceki yapıdan düzgün bir şekilde temizlememiştim. Önceki yapıdaki tüm eski .obj ve .lib dosyalarını sildikten sonra, projemi yeni mimariyle derleyebildim.
Ben

Bu benim sorunumdu ve çözüm, hedef mimarileri değiştirirken inşa etmeden önce temizlemekti.

7

Visual Studio 2012 +/- 'de "Configuration Properties'.Linker" özellik sayfası. "Command Line", "Ek Seçenekler" etiketli bir kutu içerir. X64 oluşturuyorsanız, kutunun / MACHINE içermediğinden emin olun: Projelerim yaptı ve söz konusu hatayı verdi.


4

QT yaparken bu problemle karşılaştım. Bir yerde okuduğum talimatlar VS komut istemini kullanarak nmake'yi yapılandırmamı önerdi.

X64 komut istemini seçtim ve çok fazla uğraşmadan yapılandırmayı gerçekleştirdim. Ben nmake denedim, bu hatayı verdi.

Bazı bileşenlerin 32 bit için önceden oluşturulduğunu düşünüyorum. Hata, x86 için hangi modüllerin üretildiğini bile bildirdi.

32 bit varsayılan VS komut istemini kullandım ve çalıştı.


4
Bu beni doğru yola soktu. 64 bit için inşa ediyorsanız, ortamınızı ayarlamak için bu windows kısayolunu kullanabilirsiniz: C: \ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat & "C: \ Program Dosyaları (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat" x86_amd64 & cd c: \ YourDir Bunun önemli bir kısmı x86_amd64 - ortam ayarlanmadan 32 bit bir ortam olarak ve qmake onu böyle alır.
gremwell

3

Visual Studio 2013'te,

1) Proje Özellik Sayfalarını / Yapılandırma Özelliklerini / Bağlayıcı / Tüm Seçenekleri kontrol edin ve tüm hatalı yapılandırılmış makine ve dizinleri düzeltin.

2) Proje Özellik Sayfaları / Yapılandırma Özellikleri / Bağlayıcı / Giriş'i kontrol edin ve tüm yanlış yapılandırılmış dizinleri düzeltin.

Örnek 1'e bakın)


2

vcxproj dosyası 'MACHINE: i386' içerebilir vcxproj dosyasını düzenleyiciyle düzenleyin. onu kaldır !


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

64 bit derleme seçeneğini ayarlama -m64 -cubin

İpucu derleme günlüğündedir. Bunun gibi:

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

Yani "-machine 32"sorundur.

Önce 64bit derleme seçeneğini ayarlayın, sonra yeniden hibrit derleme seçeneğini ayarlayın. Sonra başarılı görebilirsiniz.


1

Çözümünüzde lib projeleri varsa Property-> Librarian-> General içindeki Target Machine özelliğini kontrol edin


1

Jhonson'un listesine ek olarak, kütüphanenin klasörlerini de kontrol edin

Visual studio'da, ana menüden Araçlar> Seçenekler'i seçin. Projeler ve Çözümler> VC ++ Dizinleri'ni seçin. Platform açılır menüsünden x64'ü seçin.

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

1

Bu bana bugün oldu, çünkü hala x86 modundayken bir kütüphane dizini ekledim ve miras alınan dizinleri yanlışlıkla kaldırdım, onları sabit kodlu hale getirdim. Sonra x64'e geçtikten sonra, VC ++ Dizinlerim hala okunuyor:

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

_x64 yerine.


Teşekkürler. Benim sorunum buydu. Gelecekteki okuyucular için, "Kütüphane Dizinlerim" artık şöyle$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas

1

CMake kullanıyordum ve bir win32 yapılandırması ekledim. Özellik sayfası gösterdi x86 ancak bir metin düzenleyicisinde vcxproj dosyası açılırken aslında ne zaman x 64 oldu! Manuel olarak x86'ya geçmek bunu çözdü.


2
Benzer bir şeyim vardı. Hangi ayarın nerede saklandığını bilmiyorum (ve cevapların çoğunun tavsiyesini takip ettim), ancak jeneratörü belirtmek benim için bunu yaptı: cmake. -G "Visual Studio 12 Win 64".
user55937

1

Bu çok sinir bozucu ve sinir bozucu bir sorun ama bir kez anladıktan sonra, oldukça basit: başka bir tür için hedef olmasına rağmen (x86 diyelim) bir mimari tipi (sizin durumunuzda x64) inşa eden bir unsurunuz var. ).

Hangi obj dosyasının çökmeye neden olduğuna bakarak sorunun kaynağını inceleyebilir ve orada sorunu aramaya başlayabilirsiniz. Her obj bir kaynak kodu analoğuna sahip olacaktır: ya cpp, c, asm vb. Etrafında yanlış aracı kullanan özel derleme olayları olabilir. Özellik sayfalarında bunu kontrol edin.

Yapılacaklar listesi C Johnson'a gitmeden önce oraya bakardım.



0

modül makine türü, üzerinde derlediğiniz makinedir ve hedef makine türü, ikili dosyalarınızı oluşturduğunuz x86 veya x64 mimarisidir.


0

Bu sorun, projeniz Proje Özellikleri -> Yapılandırma Özellikleri -> Genel'de aynı ara dizinlere sahip olacak şekilde ayarlanmışsa da oluşabilir.


0

Her şeyden önce aşağıdakileri deneyin: 1. Configuration Manager'a gidin ve henüz yoksa yeni bir x64 oluşturun. 2. x64 çözümünü seçin. 3. proje özelliklerine gidin ve ardından Bağlayıcı-> Gelişmiş x64 makinesini seçin. 4. Şimdi çözümü yeniden oluşturun.

Hala aynı hatayı alıyorsanız. temiz bir çözüm deneyin ve daha sonra yeniden inşa ve görsel stüdyo açmak son açılan projenin listesini alacak, projeye sağ tıklayın ve oradan kaldırın. Şimdi çözüme gidin ve çözümü tekrar açın.


0

VS2008 çözümümü VS2010'a dönüştürdüğümde ve win32 yapılandırmasını X64'e dönüştürdüğümde bu olur, eski çözümümde mfcs90d.lib (Configuration-> Linker-> Input-> Ek bağımlılıklar) var, VS010 kullanıyorum mfcs100d.lib olduğu VS2010 klasöründe, bu yüzden (Configuration-> Linker-> Input-> Ek bağımlılıklar) mfcs90d.lib'i mfcs100d.lib olarak değiştirdim.


0

QT Creator ile birlikte olanlar için sorun aynıdır (@ c-johnson tarafından tarif edildiği gibi). Kitinizdeki MSVC derleyici ayarlarının aşağıda gösterildiği gibi x86 olarak ayarlandığından emin olun.

MSVC x86 derleyici için QT Creator Kit Ayarları


0

komut istemi (dos istemi) kullanan bazı kullanıcılar için bu yardımcı olabilir:

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.

Ayrıca bunu isterseniz:

CL "% 1% 2% 3" / EHsc / link user32.lib Gdi32.lib Winmm.lib comctl32.lib * .obj / ALT SİSTEM : KONSOL / MAKİNE: x86

daha önce del * .obj yapmanız gerekir ; önceki derlemeler kalan 64 ve 32 bit nesneleri ile bağlayıcı karıştırmak nasıl?


0

Yukarıda birçok iyi öneri.

Ayrıca x86 Win32'de oluşturmaya çalışıyorsanız:

Program Dosyalarında (x86) bağladığınız kitaplıkların aslında x86 kitaplıkları olduğundan emin olun, çünkü bunlar ...

Örneğin, C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ SDK içinde bağlandığım bir lib dosyası bu hatayı attı, sonunda C: \ Program Files (x86) \ Windows içinde x86 sürümünü buldum Kitler \ 10 \ Lib \ 10.0.18362.0 \ um \ x86 ve her şey yolunda gitti.


-1

İşletim sistemi nedir? Windows x64 ise, CUDA x64'ün kurulu olduğundan ve böylece VS2008'in projeyi x64 modunda derlemesi gerektiğinden emin olmanız gerekir ...

CUDA yalnızca x64 VEYA x86'yı pencerelere yükleyecek


Bu, bağlantı kurmaya ve oluşturmaya çalışırken bir hata gibi görünüyor. Temel olarak yapı ayarlarında bir uyumsuzluk veya tutarsızlık var; çeşitli oluşturma adımları için parametre olarak belirtilebilen hedef platform tutarlı değil.
Shammi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.