errore irreversibile LNK1112: il tipo di macchina del modulo 'x64' è in conflitto con il tipo di macchina di destinazione 'X86'


187

Sto usando CUDA (VC ++, Visual studio 2008sp1) per eseguire il debug di un programma FEM. Il programma può essere eseguito solo su una piattaforma Win32, per l'insufficienza di cuda. Penso che i file della libreria collegati siano tutti compilati sulla piattaforma x86, ma quando lo compilo, ricevo il messaggio di errore "errore irreversibile LNK1112: il tipo di macchina modulo 'x64' è in conflitto con il tipo di macchina di destinazione 'X86'".

Ho provato a convertire la piattaforma in x64, ma non ha funzionato. Per favore, dimmi: che cos'è il "tipo di macchina del modulo" e che cos'è il "tipo di macchina di destinazione"? Come posso superarlo?

Risposte:


262

Ho scritto un post sul blog su questo, mentre ho riscontrato questo problema esasperante, e alla fine ho riportato il mio sistema in ordine.

Queste sono le cose da controllare, in questo ordine:

  1. Controlla le opzioni delle proprietà nelle impostazioni del linker in: Proprietà> Proprietà di configurazione> Linker> Avanzate> Macchina target. Seleziona MachineX64 se hai come target una build a 64 bit o MachineX86 se stai realizzando una build a 32 bit.

  2. Seleziona Build> Configuration Manager dal menu principale in Visual Studio. Assicurati che il tuo progetto abbia la piattaforma corretta specificata. È possibile che l'IDE sia impostato per compilare x64 ma un singolo progetto nella soluzione può essere impostato su target win32. Quindi sì, Visual Studio lascia molta corda per impiccarti, ma questa è la vita.

  3. Verifica che i file della tua libreria siano realmente del tipo di piattaforma di destinazione. Questo può essere usato usando dumpbin.exe che si trova nella directory VC \ bin di Visual Studio. usa l'opzione -headers per scaricare tutte le tue funzioni. Cerca la voce macchina per ciascuna funzione. dovrebbe includere x64 se è una build a 64 bit.

  4. In Visual Studio, seleziona Strumenti> Opzioni dal menu principale. selezionare Progetti e soluzioni> Directory VC ++. Seleziona x64 dal menu a discesa Piattaforma. Assicurarsi che la prima voce sia: $ (VCInstallDir) \ bin \ x86_amd64 seguito da $ (VCInstallDir) \ bin .

Una volta fatto il passaggio 4, tutto ha funzionato di nuovo per me. Il fatto era che stavo riscontrando questo problema in tutti i miei progetti in cui volevo compilare un obiettivo a 64 bit.


6
Salvavita. Sempre al punto 4, anche le "Directory delle biblioteche" devono essere aggiornate ai percorsi a 64 bit
Gregory,

37
Per coloro che utilizzano Visual Studio 2013 - il passaggio 4 è stato deprecato, ora si apporta la modifica alle proprietà del progetto -> proprietà di configurazione -> Directory VC ++ - Directory librerie
PolyMesh

3
Se stai usando una libreria esterna che è stata compilata come x86, otterrai anche questo errore. Mi sono imbattuto in esso durante il tentativo di creare un progetto utilizzando le librerie di Google Test.
kayleeFrye_onDeck

3
Se non ho un file di progetto (eseguendo nmake su un Makefile), come posso fare la stessa cosa?
user118967

3
Come è possibile farlo sulla riga di comando invece di creare un progetto nella versione GUI?
repzero

152

Oltre all'elenco C Johnson aggiungerei il seguente punto:

Controlla in Visual Studio:
Proprietà progetto -> Proprietà configurazione -> Linker -> Riga di comando.

Le "Opzioni aggiuntive" NON devono contenere /machine:X86

Ho tale chiave, generata dall'output di CMake: CMake ha generato il progetto x86, quindi ho aggiunto la piattaforma x64 tramite Configuration Managerin Visual Studio 2010 - tutto è stato creato bene per la nuova piattaforma tranne che la riga di comando del linker, specificata /machine:X86separatamente.


20
Questo era esattamente il mio problema! Ma è stato un progetto Visual Studio 2017 generato da CMake in cui ho usato Configuration Manager per creare configurazioni di build della piattaforma x64 (in cui le configurazioni di build Win32 sono state copiate per creare le configurazioni di build x64). Quello che succede è che le impostazioni "/ MACCHINA:" del linker tra "Tutte le opzioni-> Opzioni aggiuntive" e "Avanzate-> Macchina di destinazione" sono in conflitto. Per risolvere, basta eliminare l'impostazione "Tutte le opzioni-> Opzioni aggiuntive" -> "/ MACCHINA:".
BoiseBaked

2
Questo probabilmente mi ha fatto risparmiare ore. Grazie!
rsp1984,

3
Questa è stata la soluzione per me, quindi volevo solo dire grazie, stranamente avevo già votato, quindi dovevo essere già stato qui con lo stesso problema! :)
Adam Dempsey,

1
Leggera variante di questa soluzione: alcuni progetti nella mia soluzione non hanno "Linker" in Proprietà di configurazione. Invece hanno "Bibliotecario". In quei casi, infatti Bibliotecario -> Tutte le opzioni -> Opzioni aggiuntive ha detto / macchina: x86 mentre Bibliotecario -> Tutte le opzioni -> Macchina target ha detto / macchina: x64. Ho eliminato x86 da Librarian -> Tutte le opzioni -> Opzioni aggiuntive ... e finalmente le cose sono state costruite e collegate.
Xenial,

Grazie per questi suggerimenti. Sembra essere un problema comune per gli utenti di CMake. Votazione.
Hao Xi,

54

Ho riscontrato lo stesso problema in VS2008 quando ho provato ad aggiungere una build X64 a un progetto convertito da VS2003.

Ho guardato tutto ciò che è stato trovato durante la ricerca di questo errore su Google (macchina target, directory VC ++, DUMPBIN ....) e tutto sembrava OK.

Alla fine ho creato un nuovo progetto di test e fatto le stesse modifiche e sembrava funzionare.

Fare una diff tra i file vcproj ha rivelato il problema ....

Il mio progetto convertito aveva / MACHINE: i386 impostato come opzione aggiuntiva impostata in Linker-> Riga di comando. Quindi c'erano due / MACHINE opzioni impostate (sia x64 che i386) e quella aggiuntiva prese la preferenza.

Rimuovendolo e impostandolo correttamente in Linker-> Avanzate-> Target Machine il problema è scomparso.


8
Anche questo era esattamente il mio problema, ma proveniva da una soluzione di Visual Studio creata utilizzando CMake. A CMake piace aggiungere anche questa opzione.
Nick Chadwick,

4
Sono venuto da un progetto CMake e posso confermare che ha aggiunto questa opzione.
BeeOnRope,

25

Tutte le impostazioni del progetto sembravano perfette, ma ho ancora riscontrato l'errore. Esaminare il .vcxprojfile e cercare "x86" ha rivelato il problema:

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

Una rapida ricerca / sostituzione per tutte le occorrenze (dieci impostazioni di singoli file) ha risolto il problema.


3
Anche in Proprietà progetto -> Opzioni di configurazione -> Bibliotecario -> Tutte le opzioni -> Opzioni aggiuntive.
Xenial,

13

Poiché il problema è dovuto alla differenza nelle specifiche della compilation e della macchina target (x86 e x64) Attenersi alla seguente procedura:

  1. Aprire il progetto C ++ che si desidera configurare.
  2. Scegli il pulsante Gestione configurazione per aprire la finestra di dialogo Gestione configurazione.
  3. Nell'elenco a discesa Piattaforma soluzione attiva, selezionare l'opzione per aprire la finestra di dialogo Nuova piattaforma soluzione.
  4. Nell'elenco a discesa Tipo o seleziona la nuova piattaforma, seleziona una piattaforma a 64 bit.

Ha risolto il mio problema.


12

Probabilmente hai un file .OBJ o .LIB destinato a x64 (questo è il tipo di macchina del modulo) mentre stai collegando per x86 (questo è il tipo di macchina di destinazione).

Usa DUMPBIN / HEADERS sui tuoi file .OBJ e controlla la voce macchina nel blocco VALORI FILE HEADER.


3
Questa è stata la causa principale per me quando ho riscontrato questo messaggio di errore. Avevo precedentemente creato per un'architettura e non avevo ripulito correttamente i file oggetto e le librerie da quella build precedente. Dopo aver eliminato tutti i vecchi file .obj e .lib dalla build precedente, sono stato in grado di compilare il mio progetto con la nuova architettura.
Ben

Questo era il mio problema e la soluzione era pulire prima di costruire quando si cambiano le architetture di destinazione.

7

In Visual Studio 2012 +/-, la pagina delle proprietà per "Proprietà di configurazione". Link. "Riga di comando" contiene una casella etichettata "Opzioni aggiuntive". Se si crea x64, assicurarsi che la casella non contenga / MACCHINA: I386 I miei progetti hanno fatto e ha generato l'errore in questione.


4

Mi sono imbattuto in questo problema durante la creazione di QT. Le istruzioni che ho letto da qualche parte mi hanno suggerito di configurare nmake usando il prompt dei comandi VS.

Ho scelto il prompt dei comandi x64 e ho eseguito la configurazione senza troppi problemi. Quando ho provato nmake, ha dato questo errore.

Penso che alcuni dei componenti siano stati pre-costruiti per 32-bit. L'errore ha anche segnalato quali moduli sono stati creati per x86.

Ho usato il prompt dei comandi VS predefinito a 32 bit e ha funzionato.


4
Questo mi ha messo sulla strada giusta. Se stai costruendo per 64 bit, puoi usare questo collegamento di Windows per configurare il tuo ambiente: C: \ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat & "C: \ Programmi (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat" x86_amd64 & cd c: \ YourDir La parte importante è x86_amd64 - senza che l'ambiente sia impostato come un ambiente a 32 bit e qmake lo prende come tale.
gremwell,

3

In Visual Studio 2013,

1) Controllare nelle pagine delle proprietà del progetto / Proprietà di configurazione / Linker / Tutte le opzioni e correggere tutte le macchine e le directory configurate per mancate.

2) Controllare nelle pagine delle proprietà del progetto / Proprietà di configurazione / Linker / Input e correggere tutte le directory configurate miss.

Vedi esempio di 1)


2

Il file vcxproj può contenere 'MACHINE: i386' Modifica il file vcxproj con l'editor. rimuoverla !


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

Impostare l'opzione di compilazione a 64 bit -m64 -cubin

Il suggerimento è nel registro di compilazione. Come questo:

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

Questo "-machine 32"è un problema.

Prima impostare l'opzione di compilazione a 64 bit, quindi reimpostare l'opzione di compilazione ibrida. Quindi puoi vedere il successo.


1

Se la tua soluzione ha progetti lib controlla la proprietà Target Machine in Proprietà-> Bibliotecario-> Generale


1

Oltre all'elenco di Jhonson, controlla anche le cartelle della libreria

In Visual Studio, seleziona Strumenti> Opzioni dal menu principale. selezionare Progetti e soluzioni> Directory VC ++. Seleziona x64 dal menu a discesa Piattaforma.

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

1

Questo mi è successo oggi perché avevo aggiunto una directory della libreria mentre ero ancora in modalità x86, e ho rimosso accidentalmente le directory ereditate, rendendole invece hardcoded. Quindi, dopo essere passato a x64, le mie directory VC ++ continuano a leggere:

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

invece di _x64.


Grazie. Questo era il mio problema. Per i futuri lettori, la mia "Directory Library" ora legge$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas il

1

Stavo usando CMake e quindi ho aggiunto una configurazione win32. La pagina delle proprietà mostrava x86 ma in realtà quando si apriva il file vcxproj in un editor di testo era x64! Il passaggio manuale a x86 ha risolto questo problema.


2
Ho avuto qualcosa di simile. Non so quale impostazione nascondesse dove (e ho seguito il consiglio della maggior parte delle risposte qui), ma specificando il generatore di conseguenza lo ha fatto per me: cmake. -G "Visual Studio 12 Win 64".
user55937

1

È un problema molto frustrante e fastidioso, ma una volta che lo capisci, è abbastanza semplice: hai qualche elemento nel costruire quel tipo di architettura (nel tuo caso x64) nonostante sia stato targetato per un altro tipo (diciamo x86 ).

Puoi analizzare l'origine del tuo problema osservando quale file obj sta causando l'arresto anomalo e iniziare a cercare lì il problema. Ogni obj avrà un analogo del codice sorgente: in cpp, c, asm ecc. Potrebbero esserci eventi di build speciali attorno ad esso che stanno usando lo strumento sbagliato. Verificare che nelle schede delle proprietà.

Guarderei lì prima di esaminare l'elenco delle cose da fare di C Johnson.


1

Ho risolto questo problema modificando Win32 in * 64 in Visual Studio 2013.


0

il tipo di macchina del modulo è la macchina su cui si sta compilando e il tipo di macchina di destinazione è l'architettura x86 o x64 per la quale si stanno costruendo i binari.


0

Questo problema può verificarsi anche se il progetto è impostato per avere le stesse directory intermedie in Proprietà progetto -> Proprietà di configurazione -> Generale


0

Prima di tutto prova le seguenti cose: 1. vai a Configuration Manager e crea un nuovo x64 se non è già lì. 2. selezionare la soluzione x64. 3. vai alle proprietà del progetto e poi Linker-> Avanzate seleziona macchina x64. 4. Ora ricostruisci la soluzione.

Se continui a ricevere lo stesso errore. prova una soluzione pulita, quindi ricostruisci di nuovo e apri Visual Studio otterrai l'elenco dei recenti progetti aperti, fai clic con il pulsante destro del mouse sul progetto e rimuovilo da lì. Ora vai alla soluzione e riapri la soluzione.


0

questo succede a me quando converto la mia soluzione VS2008 in VS2010 e cambio la configurazione di win32 in X64, nella mia vecchia soluzione ho mfcs90d.lib (Configurazione-> Linker-> Input-> Dipendenze aggiuntive), poiché sto usando VS010 ho appena verificato nella cartella VS2010 dove è mfcs100d.lib, quindi ho cambiato mfcs90d.lib in mfcs100d.lib in (Configurazione-> Linker-> Input-> Dipendenze aggiuntive) ha funzionato bene.


0

Per coloro che sono con QT Creator, il problema è lo stesso (come descritto da @ c-johnson). Assicurarsi che le impostazioni del compilatore per MSVC nel kit siano impostate su x86 come mostrato di seguito.

QT Creator Kit Settings per il compilatore x86 di MSVC


0

per alcuni che usano il prompt dei comandi (dos prompt) questo potrebbe essere utile:

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.

Anche se ti piace in questo modo:

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

devi prima cancellare * .obj ; evitare il linker confuso con oggetti a 64 e 32 bit rimasti dalle compilazioni precedenti?


0

Molti buoni suggerimenti sopra.

Inoltre, se stai cercando di compilare in Win32 x86:

Assicurati che tutte le librerie a cui ti colleghi in Programmi (x86) siano in realtà librerie x86 perché non sono necessariamente ...

Ad esempio un file lib a cui ho collegato C: \ Programmi (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ SDK ha generato quell'errore, alla fine ho trovato una versione x86 in C: \ Programmi (x86) \ Windows Kits \ 10 \ Lib \ 10.0.18362.0 \ um \ x86 e tutto ha funzionato bene.


-1

che cos'è il sistema operativo? se si tratta di Windows x64, è necessario assicurarsi che CUDA x64 sia stato installato e che VS2008 debba compilare il progetto in modalità x64 ...

CUDA installerà solo x64 OR x86 in Windows


Questo sembra essere un errore durante la creazione e il tentativo di collegamento. Fondamentalmente si tratta di una mancata corrispondenza o incoerenza nelle impostazioni di compilazione; la piattaforma di destinazione che può essere specificata come parametro per varie fasi di compilazione non è coerente.
Shammi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.