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

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 li compilo, ottengo il messaggio di errore “Errore irreversibile LNK1112: il tipo di macchina del 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 target”? Come posso superarlo?

Ho scritto un post su questo argomento, poiché ho riscontrato questo problema esasperante e infine ho rimesso in funzione il mio sistema.

Queste sono le cose da controllare, in questo ordine:

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

  2. Seleziona Build> Configuration Manager dal menu principale in visual studio. Assicurati che il tuo progetto abbia la piattaforma corretta specificata. È ansible che IDE sia impostato per creare x64 ma un singolo progetto nella soluzione può essere impostato su target win32. Quindi sì, lo studio visivo lascia un sacco di corde per impiccarsi, ma questa è la vita.

  3. Controlla i file della tua libreria che sono realmente del tipo di piattaforma che prendono di mira. Questo può essere usato usando dumpbin.exe che si trova nella directory VC \ bin dello studio visivo. usa l’opzione -headers per scaricare tutte le tue funzioni. Cerca la voce della macchina per ogni 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 punto 4, tutto ha funzionato di nuovo per me. La cosa era che stavo incontrando questo problema su tutti i miei progetti in cui volevo compilare verso un objective a 64 bit.

Oltre alla lista di C Johnson aggiungerei il seguente punto:

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

“Opzioni aggiuntive” NON dovrebbe contenere /machine:X86

Ho una tale chiave, generata dall’output di CMake: CMake ha generato un progetto x86, poi ho aggiunto la piattaforma x64 tramite Configuration Manager in Visual Studio 2010 – tutto è stato creato per la nuova piattaforma eccetto la riga di comando del linker, specificato /machine:X86 separatamente.

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

Ho esaminato tutto ciò che è stato trovato durante la ricerca di questo errore su Google (computer di destinazione, directory VC ++, DUMPBIN ….) e tutto sembrava OK.

Alla fine ho creato un nuovo progetto di test e ho fatto gli stessi cambiamenti e sembrava funzionare.

Fare una differenza tra i file vcproj ha rivelato il problema ….

Il mio progetto convertito aveva / MACCHINA: 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 aveva la preferenza.

Rimuovendo questo e impostandolo correttamente sotto Linker-> Advanced-> Target Machine il problema è scomparso.

Tutte le impostazioni del progetto sembravano perfette, ma ho comunque ricevuto l’errore. L’ .vcxproj file .vcxproj e la ricerca di “x86” hanno rivelato il problema:

   /machine:X86 %(AdditionalOptions)  

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

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

Utilizzare DUMPBIN / HEADERS sui file .OBJ e verificare la voce della macchina nel blocco FILE HEADER VALUES.

Poiché il problema è dovuto alla differenza tra le specifiche della macchina di compilazione e di destinazione (x86 e x64), procedere come segue:

  1. Apri il progetto C ++ che vuoi configurare.
  2. Scegliere il pulsante Gestore configurazione per aprire la finestra di dialogo Gestore configurazione.
  3. Nell’elenco a discesa Piattaforma soluzione triggers, selezionare l’opzione per aprire la finestra di dialogo Nuova piattaforma di soluzione.
  4. Nel Tipo o selezionare il nuovo elenco a discesa della piattaforma, selezionare una piattaforma a 64 bit.

Ha risolto il mio problema.

In Visual Studio 2012 +/-, la pagina delle proprietà per “Proprietà di configurazione” .Linker “. Riga di comando” contiene una casella con l’etichetta “Opzioni aggiuntive” .Se stai creando x64, assicurati che la casella non contenga / MACCHINA: I386 I miei progetti hanno generato l’errore in questione.

In Visual Studio 2013,

1) Controlla le pagine delle proprietà del progetto / Proprietà di configurazione / Linker / Tutte le opzioni e correggi tutte le macchine e le directory configurate.

2) Controllare le pagine delle proprietà del progetto / Proprietà di configurazione / linker / input e correggere tutte le directory configurate mancanti.

Vedi esempio di 1)

Mi sono imbattuto in questo problema durante la creazione di QT. Le istruzioni che ho letto da qualche parte suggerivano di configurare nmake usando il prompt dei comandi di 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 componenti fossero pre-costruiti per 32-bit. L’errore riportava anche quali moduli sono stati creati per x86.

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

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

Imposta l’opzione di compilazione a 64 bit -m64 -cubin

Il suggerimento è al log di compilazione. Come questo:

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

Quella "-machine 32" è un problema.

Prima opzione di compilazione a 64 bit, prossima re impostazione opzione di compilazione ibrida. Allora puoi vedere il successo.

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

Oltre all’elenco di Jhonson, controlla anche le cartelle della biblioteca

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; 

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

“…; $ (VC_LibraryPath_x86); $ (WindowsSDK_LibraryPath_x86);”

invece del _x64.

Stavo usando CMake e poi ho aggiunto una configurazione win32. La pagina delle proprietà mostrava x86 ma in realtà quando aprivo il file vcxproj in un editor di testo era x64! Cambiare manualmente in x86 ha risolto questo problema.

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 cui si stanno costruendo i file binari.

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

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

Se continui a ricevere lo stesso errore. prova la soluzione pulita e poi ricostruisci di nuovo e apri Visual Studio riceverai l’elenco dei progetti aperti di recente, fai clic con il tasto destro del mouse sul progetto e rimuovilo da lì. Ora vai alla soluzione e riapri nuovamente la soluzione.

È un problema molto frustrante e fastidioso, ma una volta capito, è piuttosto semplice: hai qualche elemento in te che costruisci un tipo di architettura (nel tuo caso x64) nonostante sia stato scelto come target per un altro tipo (ad esempio x86 ).

Puoi analizzare l’origine del tuo problema osservando quale file obj sta causando l’arresto e inizia a cercare il problema. Ogni object avrà un codice sorgente analogico: in cpp, c, asm ecc. Potrebbero esserci eventi speciali di build attorno ad esso che utilizzano lo strumento sbagliato. Verificare che nelle tabs proprietà.

Ci darei un’occhiata prima di passare attraverso l’elenco delle cose da fare di C Johnson.

mi succede quando converto la mia soluzione VS2008 in VS2010 e cambio la configurazione di Win32 in X64, nella mia vecchia soluzione ho mfcs90d.lib (Configuration-> Linker-> Input-> Additional dependencies), visto che sto usando VS010 ho appena controllato nella cartella VS2010 dove è mfcs100d.lib, quindi ho cambiato mfcs90d.lib in mfcs100d.lib in (Configuration-> Linker-> Input-> Additional dependencies) ha funzionato bene.

il file vcxproj può contenere “MACHINE: i386” Modifica il file vcxproj con l’editor. rimuoverla !

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

qual è il sistema operativo? se è un x64 di Windows, allora devi assicurarti che sia installato CUDA x64 e quindi che VS2008 debba compilare il progetto in modalità x64 …

CUDA installerà x64 OR x86 solo in Windows