Schwerwiegender Fehler LNK1112: Modulmaschinentyp 'x64' kollidiert mit Zielmaschinentyp 'X86'

187

Ich verwende CUDA (VC ++, Visual Studio 2008sp1), um ein FEM-Programm zu debuggen. Das Programm kann nur auf einer Win32-Plattform ausgeführt werden, da cuda nicht ausreicht. Ich denke, die verknüpften Bibliotheksdateien sind alle auf der x86-Plattform kompiliert, aber wenn ich sie kompiliere, erhalte ich die Fehlermeldung "Schwerwiegender Fehler LNK1112: Modulmaschinentyp 'x64' kollidiert mit Zielmaschinentyp 'X86'".

Ich habe versucht, die Plattform auf x64 zu konvertieren, aber es hat nicht funktioniert. Bitte sagen Sie mir: Was ist "Modulmaschinentyp" und was ist "Zielmaschinentyp"? Wie kann ich es überwinden?

user430382
quelle

Antworten:

261

Ich schrieb einen Blogeintrag darüber, als ich auf dieses verrückte Problem stieß, und riss mein System schließlich wieder in einen funktionsfähigen Zustand.

Dies sind die Dinge, die in dieser Reihenfolge überprüft werden müssen:

  1. Überprüfen Sie Ihre Eigenschaftenoptionen in Ihren Linker-Einstellungen unter: Eigenschaften> Konfigurationseigenschaften> Linker> Erweitert> Zielcomputer. Wählen Sie MachineX64, wenn Sie einen 64-Bit-Build anstreben, oder MachineX86, wenn Sie einen 32-Bit-Build erstellen.

  2. Wählen Sie im Hauptmenü von Visual Studio Build> Configuration Manager. Stellen Sie sicher, dass für Ihr Projekt die richtige Plattform angegeben ist. Es ist möglich, dass die IDE so eingestellt ist, dass x64 erstellt wird, aber ein einzelnes Projekt in der Lösung kann so eingestellt werden, dass es auf win32 abzielt. Also ja, Visual Studio lässt viel Seil, um sich aufzuhängen, aber so ist das Leben.

  3. Überprüfen Sie in Ihren Bibliotheksdateien, ob sie wirklich von der Art der Plattform sind, auf die sie abzielen. Dies kann mithilfe von dumpbin.exe verwendet werden, die sich in Ihrem Visual Studio VC \ bin-Verzeichnis befindet. Verwenden Sie die Option -headers, um alle Ihre Funktionen zu sichern. Suchen Sie für jede Funktion nach dem Maschineneintrag. Es sollte x64 enthalten, wenn es sich um einen 64-Bit-Build handelt.

  4. Wählen Sie in Visual Studio im Hauptmenü Extras> Optionen. Wählen Sie Projekte und Lösungen> VC ++ - Verzeichnisse. Wählen Sie x64 aus der Dropdown-Liste Plattform. Stellen Sie sicher, dass der erste Eintrag $ (VCInstallDir) \ bin \ x86_amd64 gefolgt von $ (VCInstallDir) \ bin lautet .

Sobald ich Schritt 4 gemacht habe, hat alles wieder für mich funktioniert. Die Sache war, dass ich bei all meinen Projekten, bei denen ich auf ein 64-Bit-Ziel kompilieren wollte, auf dieses Problem stieß.

C Johnson
quelle
6
Lebensretter. Ebenfalls in Schritt 4 müssen die "Bibliotheksverzeichnisse" auf die 64-Bit-Pfade aktualisiert werden
Gregory
37
Für diejenigen, die Visual Studio 2013 verwenden - Schritt 4 ist veraltet, nehmen Sie jetzt die Änderung in den Projekteigenschaften -> Konfigurationseigenschaften -> VC ++ - Verzeichnisse - Bibliotheksverzeichnisse
PolyMesh
3
Wenn Sie eine externe Bibliothek verwenden, die als x86 kompiliert wurde, wird dieser Fehler ebenfalls angezeigt. Ich bin darauf gestoßen, als ich versucht habe, ein Projekt mit den Google Test-Bibliotheken zu erstellen.
KayleeFrye_onDeck
3
Wie mache ich dasselbe, wenn ich keine Projektdatei habe (nmake auf einem Makefile ausführen)?
user118967
3
Wie können Sie dies in der Befehlszeile tun, anstatt ein Projekt in der GUI-Version zu erstellen?
Repzero
152

Zusätzlich zur C Johnson- Liste möchte ich folgenden Punkt hinzufügen:

Checken Sie in Visual Studio ein:
Projekteigenschaften -> Konfigurationseigenschaften -> Linker -> Befehlszeile.

"Zusätzliche Optionen" sollten NICHT enthalten /machine:X86

Ich habe einen solchen Schlüssel, der durch die CMake-Ausgabe generiert wurde: CMake hat ein x86-Projekt generiert, dann habe ich die x64-Plattform über Configuration Managerin Visual Studio 2010 hinzugefügt - alles wurde einwandfrei für die neue Plattform erstellt, außer dass die Linker-Befehlszeile /machine:X86separat angegeben wurde .

sergtk
quelle
20
Das war genau mein Problem! Es war jedoch ein von CMake generiertes Visual Studio 2017-Projekt, bei dem ich mit dem Konfigurationsmanager x64-Plattform-Build-Konfigurationen erstellt habe (wobei die Win32-Build-Konfigurationen kopiert wurden, um die x64-Build-Konfigurationen zu erstellen). Was passiert ist, dass die "/ MACHINE:" - Einstellungen des Linkers zwischen "Alle Optionen-> Zusätzliche Optionen" und "Erweitert-> Zielmaschine" in Konflikt stehen. Um dies zu beheben, löschen Sie einfach die Einstellung "Alle Optionen-> Zusätzliche Optionen" -> "/ MASCHINE:".
BoiseBaked
2
Das hat mir wahrscheinlich Stunden gespart. Vielen Dank!
rsp1984
3
Dies war die Lösung für mich, also wollte ich mich nur bedanken, seltsamerweise hatte ich mich bereits hochgestimmt, also musste ich schon einmal mit dem gleichen Problem hier gewesen sein! :)
Adam Dempsey
1
Leichte Variante dieser Lösung: Einige Projekte in meiner Lösung haben keinen "Linker" in den Konfigurationseigenschaften. Stattdessen haben sie "Bibliothekar". In diesen Fällen tatsächlich Bibliothekar -> Alle Optionen -> Zusätzliche Optionen sagte / Maschine: x86, während Bibliothekar -> Alle Optionen -> Zielmaschine sagte / Maschine: x64. Ich habe den x86 aus Librarian -> All Options -> Additional Options ... gelöscht und die Dinge endlich erstellt und verknüpft.
Xenial
Danke für diese Tipps. Dies scheint ein häufiges Problem für CMake-Benutzer zu sein. Up Abstimmung.
Hao Xi
54

Ich hatte das gleiche Problem in VS2008, als ich versuchte, einem von VS2003 konvertierten Projekt einen X64-Build hinzuzufügen.

Ich habe mir alles angesehen, was bei der Suche nach diesem Fehler in Google gefunden wurde (Zielcomputer, VC ++ - Verzeichnisse, DUMPBIN ...), und alles sah in Ordnung aus.

Schließlich habe ich ein neues Testprojekt erstellt und die gleichen Änderungen vorgenommen, und es schien zu funktionieren.

Ein Unterschied zwischen den vcproj-Dateien ergab das Problem ....

In meinem konvertierten Projekt wurde / MACHINE: i386 als zusätzliche Option unter Linker-> Befehlszeile festgelegt. Daher wurden zwei / MACHINE-Optionen festgelegt (sowohl x64 als auch i386), und die zusätzliche Option wurde bevorzugt.

Wenn Sie dies entfernen und unter Linker-> Erweitert-> Zielmaschine richtig einstellen, ist das Problem verschwunden.

Zid
quelle
8
Dies war auch genau mein Problem - aber dies kam von einer Visual Studio-Lösung, die mit CMake erstellt wurde. Sieht so aus, als würde CMake diese Option auch gerne hinzufügen.
Nick Chadwick
4
Ich stamme aus einem CMake-Projekt und kann bestätigen, dass diese Option hinzugefügt wurde.
BeeOnRope
25

Alle Projekteinstellungen schienen perfekt zu sein, aber ich habe trotzdem den Fehler erhalten. Ein Blick in die .vcxprojDatei und die Suche nach "x86" ergab das Problem:

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

Eine schnelle Suche / Ersetzung für alle Vorkommen (zehn einzelne Dateieinstellungen) behebt das Problem.

lama12345
quelle
3
Auch unter Projekteigenschaften -> Konfigurationsoptionen -> Bibliothekar -> Alle Optionen -> Zusätzliche Optionen.
Xenial
13

Da das Problem auf die unterschiedlichen Kompilierungs- und Zielcomputerspezifikationen (x86 und x64) zurückzuführen ist, führen Sie die folgenden Schritte aus:

  1. Öffnen Sie das C ++ - Projekt, das Sie konfigurieren möchten.
  2. Wählen Sie die Schaltfläche Configuration Manager, um das Dialogfeld Configuration Manager zu öffnen.
  3. Wählen Sie in der Dropdown-Liste Active Solution Platform die Option zum Öffnen des Dialogfelds New Solution Platform aus.
  4. Wählen Sie in der Dropdown-Liste Typ oder Neue Plattform auswählen eine 64-Bit-Plattform aus.

Es hat mein Problem gelöst.

hab
quelle
12

Sie haben wahrscheinlich eine .OBJ- oder .LIB-Datei, die für x64 (das ist der Modulmaschinentyp) bestimmt ist, während Sie für x86 (das ist der Zielmaschinentyp) verknüpfen.

Verwenden Sie DUMPBIN / HEADERS für Ihre .OBJ-Dateien und überprüfen Sie den Maschineneintrag im Block FILE HEADER VALUES.

Patrick
quelle
3
Dies war die Hauptursache für mich, als ich auf diese Fehlermeldung stieß. Ich hatte zuvor für eine Architektur erstellt und die Objektdateien und Bibliotheken von diesem vorherigen Build nicht ordnungsgemäß bereinigt. Nachdem ich alle alten OBJ- und LIB-Dateien aus dem vorherigen Build gelöscht hatte, konnte ich mein Projekt mit der neuen Architektur kompilieren.
Ben
Dies war mein Problem und die Lösung bestand darin, vor dem Erstellen zu reinigen, wenn Zielarchitekturen geändert wurden.
7

In Visual Studio 2012 +/- enthält die Eigenschaftsseite für "Konfigurationseigenschaften". Linker. "Befehlszeile" ein Feld mit der Bezeichnung "Zusätzliche Optionen". Wenn Sie x64 erstellen, stellen Sie sicher, dass das Feld / MACHINE nicht enthält: I386. Meine Projekte haben es getan und es hat den fraglichen Fehler erzeugt.

laloumen
quelle
4

Ich bin beim Erstellen von QT auf dieses Problem gestoßen. Die Anweisungen, die ich irgendwo gelesen habe, deuteten darauf hin, dass ich nmake über die VS-Eingabeaufforderung konfiguriere.

Ich habe die x64-Eingabeaufforderung ausgewählt und die Konfiguration ohne großen Aufwand durchgeführt. Als ich nmake ausprobierte, gab es diesen Fehler.

Ich denke, einige der Komponenten wurden für 32-Bit vorgefertigt. Der Fehler meldete sogar, welche Module für x86 erstellt wurden.

Ich habe die 32-Bit-Standard-VS-Eingabeaufforderung verwendet und es hat funktioniert.

pvairam
quelle
4
Das hat mich auf den richtigen Weg gebracht. Wenn Sie für 64-Bit erstellen, können Sie diese Windows-Verknüpfung verwenden, um Ihre Umgebung einzurichten: C: \ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat & "C: \ Programme (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat" x86_amd64 & cd c: \ YourDir Der wichtige Teil dabei ist x86_amd64 - ohne dass die Umgebung festgelegt ist als 32-Bit-Umgebung und qmake nimmt es als solche auf.
Gremwell
3

In Visual Studio 2013

1) Überprüfen Sie die Projekteigenschaftsseiten / Konfigurationseigenschaften / Linker / Alle Optionen und korrigieren Sie alle fehlkonfigurierten Maschinen und Verzeichnisse.

2) Überprüfen Sie die Projekteigenschaftsseiten / Konfigurationseigenschaften / Linker / Eingabe und korrigieren Sie alle fehlkonfigurierten Verzeichnisse.

Siehe Beispiel von 1)

Fabceolin
quelle
2

Die vcxproj-Datei enthält möglicherweise 'MACHINE: i386'. Bearbeiten Sie die vcxproj-Datei mit dem Editor. entfernen Sie es !

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

Stellen Sie die 64-Bit-Kompilierungsoption ein -m64 -cubin

Der Hinweis befindet sich im Kompilierungsprotokoll. So was:

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

Das "-machine 32"ist ein Problem.

Stellen Sie zuerst die 64-Bit-Kompilierungsoption und dann die Hybrid-Kompilierungsoption neu ein. Dann können Sie den Erfolg sehen.

chang
quelle
1

Wenn Ihre Lösung lib-Projekte enthält, überprüfen Sie die Eigenschaft Zielmaschine unter Eigenschaft-> Bibliothekar-> Allgemein

Rinat
quelle
1

Überprüfen Sie neben Jhonsons Liste auch die Ordner der Bibliothek

Wählen Sie in Visual Studio im Hauptmenü Extras> Optionen. Wählen Sie Projekte und Lösungen> VC ++ - Verzeichnisse. Wählen Sie x64 aus der Dropdown-Liste Plattform.

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;
Igor Barbar
quelle
1

Dies ist mir heute passiert, weil ich im x86-Modus ein Bibliotheksverzeichnis hinzugefügt und die geerbten Verzeichnisse versehentlich entfernt habe, sodass sie stattdessen fest codiert wurden. Nach dem Wechsel zu x64 lesen meine VC ++ - Verzeichnisse immer noch:

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

anstelle des _x64.

masterxilo
quelle
Vielen Dank. Das war mein problem Für zukünftige Leser lautet mein "Bibliotheksverzeichnis" jetzt$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas
1

Ich habe CMake verwendet und dann eine Win32-Konfiguration hinzugefügt. Die Eigenschaftsseite zeigte x86, aber beim Öffnen der vcxproj-Datei in einem Texteditor war es x64! Der manuelle Wechsel zu x86 löste dieses Problem.

grunzen
quelle
2
Ich hatte etwas ähnliches. Ich weiß nicht, welche Einstellung sich wo versteckt hat (und ich habe den Rat der meisten Antworten hier befolgt), aber die Angabe des Generators hat es für mich getan: cmake. -G "Visual Studio 12 Win 64".
user55937
1

Es ist ein sehr frustrierendes und ärgerliches Problem, aber sobald Sie es verstanden haben, ist es ganz einfach: Sie haben ein Element in Ihrem Build, das einen Architekturtyp (in Ihrem Fall x64) erstellt, obwohl es ein Ziel für einen anderen Typ war (z. B. x86) ).

Sie können die Ursache Ihres Problems ermitteln, indem Sie sich ansehen, welche obj-Datei den Absturz verursacht, und dort nach dem Problem suchen. Jedes Objekt hat einen analogen Quellcode: entweder in cpp, c, asm usw. Es kann spezielle Build-Ereignisse geben, die das falsche Tool verwenden. Überprüfen Sie dies in den Eigenschaftenblättern.

Ich würde zuerst dort nachsehen, bevor ich die Liste der zu erledigenden Dinge von C Johnson durchgehen würde.


quelle
1

Ich habe dieses Problem gelöst, indem ich Win32 in Visual Studio 2013 auf * 64 geändert habe.

Salman Saleh
quelle
0

Der Modulmaschinentyp ist der Computer, auf dem Sie kompilieren, und der Zielcomputertyp ist die Architektur x86 oder x64, für die Sie Ihre Binärdateien erstellen.

djs
quelle
0

Dieses Problem kann auch auftreten, wenn Ihr Projekt unter Projekteigenschaften -> Konfigurationseigenschaften -> Allgemein so eingerichtet ist, dass es dieselben Zwischenverzeichnisse hat

Anton K.
quelle
0

Versuchen Sie zunächst Folgendes: 1. Gehen Sie zum Konfigurationsmanager und erstellen Sie ein neues x64, falls es noch nicht vorhanden ist. 2. Wählen Sie die x64-Lösung aus. 3. Gehen Sie zu den Projekteigenschaften und wählen Sie dann Linker-> Erweitert x64-Computer auswählen. 4. Erstellen Sie nun die Lösung neu.

Wenn immer noch der gleiche Fehler angezeigt wird. Versuchen Sie es mit einer sauberen Lösung und erstellen Sie sie erneut. Öffnen Sie Visual Studio. Sie erhalten eine Liste der zuletzt geöffneten Projekte. Klicken Sie mit der rechten Maustaste auf das Projekt und entfernen Sie es von dort. Gehen Sie nun zur Lösung und öffnen Sie die Lösung erneut.

Digvijay Rathore
quelle
0

Dies passiert mir, wenn ich meine VS2008-Lösung in VS2010 konvertiere und die Win32-Konfiguration in X64 ändere. In meiner alten Lösung habe ich mfcs90d.lib (Konfiguration-> Linker-> Eingabe-> Zusätzliche Abhängigkeiten), da ich VS010 verwende, habe ich gerade überprüft Im VS2010-Ordner, in dem es sich um mfcs100d.lib handelt, habe ich mfcs90d.lib in mfcs100d.lib geändert (Konfiguration-> Linker-> Eingabe-> Zusätzliche Abhängigkeiten).

NDestiny
quelle
0

Für diejenigen, die mit QT Creator arbeiten, ist das Problem dasselbe (wie von @ c-johnson beschrieben). Stellen Sie sicher, dass die Compilereinstellungen für MSVC in Ihrem Kit wie unten gezeigt auf x86 eingestellt sind.

QT Creator Kit-Einstellungen für MSVC x86-Compiler

Jimson Kannanthara James
quelle
0

Für einige Benutzer der Eingabeaufforderung (dos prompt) kann dies hilfreich sein:

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.

Auch wenn dir das gefällt:

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

Sie müssen vorher * .obj löschen ; um zu vermeiden, dass Linker mit 64- und 32-Bit-Objekten verwechselt werden, die von früheren Kompilierungen übrig geblieben sind?

kris2k
quelle
0

Viele gute Vorschläge oben.

Auch wenn Sie versuchen, x86 Win32 einzubauen:

Stellen Sie sicher, dass alle Bibliotheken, auf die Sie in Programmdateien (x86) verweisen, tatsächlich x86-Bibliotheken sind, da sie nicht unbedingt ...

Zum Beispiel hat eine lib-Datei, mit der ich in C: \ Programme (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ SDK verknüpft war, diesen Fehler ausgelöst. Schließlich habe ich eine x86-Version davon in C: \ Programme (x86) \ Windows gefunden Kits \ 10 \ Lib \ 10.0.18362.0 \ um \ x86 und alles hat gut funktioniert.

GrahamJ
quelle
-1

Was ist das Betriebssystem? Wenn es sich um ein Windows x64 handelt, müssen Sie sicherstellen, dass CUDA x64 installiert wurde und dass VS2008 das Projekt im x64-Modus kompilieren soll ...

CUDA installiert nur x64 ODER x86 in Windows

Conor
quelle
Dies scheint ein Fehler beim Erstellen und Versuchen einer Verknüpfung zu sein. Grundsätzlich ist es eine Nichtübereinstimmung oder Inkonsistenz in den Build-Einstellungen; Die Zielplattform, die als Parameter für verschiedene Erstellungsschritte angegeben werden kann, ist nicht konsistent.
Shammi