error fatal LNK1112: el tipo de máquina del módulo 'x64' entra en conflicto con el tipo de máquina de destino 'X86'

187

Estoy usando CUDA (VC ++, Visual studio 2008sp1) para depurar un programa FEM. El programa solo puede ejecutarse en una plataforma Win32, por la insuficiencia de cuda. Creo que los archivos de biblioteca vinculados están compilados en la plataforma x86, pero cuando lo compilo, aparece el mensaje de error "error grave LNK1112: el tipo de máquina del módulo 'x64' entra en conflicto con el tipo de máquina de destino 'X86'".

Intenté convertir la plataforma a x64, pero no funcionó. Dígame: ¿qué es el "tipo de máquina de módulo" y qué es el "tipo de máquina de destino"? ¿Cómo puedo superarlo?

user430382
fuente

Respuestas:

262

Escribí una entrada de blog sobre esto, cuando me encontré con este problema enloquecedor, y finalmente volví a poner mi sistema en funcionamiento.

Estas son las cosas que debe verificar, en este orden:

  1. Verifique sus opciones de propiedades en la configuración de su enlazador en: Propiedades> Propiedades de configuración> Enlazador> Avanzado> Máquina de destino. Seleccione MachineX64 si está apuntando a una compilación de 64 bits, o MachineX86 si está haciendo una compilación de 32 bits.

  2. Seleccione Build> Configuration Manager en el menú principal en Visual Studio. Asegúrese de que su proyecto tenga la plataforma correcta especificada. Es posible que el IDE se configure para construir x64, pero un proyecto individual en la solución se puede configurar para apuntar a win32. Así que sí, Visual Studio deja mucha cuerda para ahorcarse, pero así es la vida.

  3. Verifique los archivos de su biblioteca que realmente son del tipo de plataforma a la que se dirigen. Esto se puede usar mediante dumpbin.exe que se encuentra en el directorio visual studio VC \ bin. use la opción -headers para volcar todas sus funciones. Busque la entrada de la máquina para cada función. debería incluir x64 si es una compilación de 64 bits.

  4. En Visual Studio, seleccione Herramientas> Opciones en el menú principal. seleccione Proyectos y soluciones> Directorios VC ++. Seleccione x64 en el menú desplegable Plataforma. Asegúrese de que la primera entrada sea: $ (VCInstallDir) \ bin \ x86_amd64 seguido de $ (VCInstallDir) \ bin .

Una vez que hice el paso 4, todo volvió a funcionar para mí. La cuestión era que estaba encontrando este problema en todos mis proyectos en los que quería compilar hacia un objetivo de 64 bits.

C Johnson
fuente
66
Salvavidas También en el paso 4, los "Directorios de la Biblioteca" también deben actualizarse a las rutas de 64 bits
Gregory
37
Para aquellos que usan Visual Studio 2013: el paso 4 ha quedado en desuso, ahora realiza el cambio en las propiedades del proyecto -> propiedades de configuración -> Directorios VC ++ - Directorios de biblioteca
PolyMesh
3
Si está utilizando una biblioteca externa que se compiló como x86, también recibirá este error. Me encontré con él cuando intentaba construir un proyecto usando las librerías de Google Test.
kayleeFrye_onDeck
3
Si no tengo un archivo de proyecto (ejecutando nmake en un Makefile), ¿cómo hago lo mismo?
user118967
3
¿Cómo puede hacer esto en la línea de comandos en lugar de crear un proyecto en la versión GUI?
repzero
152

Además de la lista de C Johnson , agregaría el siguiente punto:

Compruebe en Visual Studio:
Propiedades del proyecto -> Propiedades de configuración -> Vinculador -> Línea de comando.

Las "Opciones adicionales" NO deben contener /machine:X86

Tengo esa clave, generada por la salida de CMake: CMake generó el proyecto x86, luego agregué la plataforma x64 a través Configuration Managerde Visual Studio 2010: todo se creó bien para la nueva plataforma, excepto la línea de comando del vinculador, especificada por /machine:X86separado.

sergtk
fuente
20
Este fue exactamente mi problema! Pero fue un proyecto de Visual Studio 2017 generado por CMake donde utilicé el Administrador de configuración para crear configuraciones de compilación de la plataforma x64 (donde las configuraciones de compilación de Win32 se copiaron para crear las configuraciones de compilación de x64). Lo que sucede es que la configuración "/ MÁQUINA:" del enlazador entre "Todas las opciones-> Opciones adicionales" y "Avanzado-> Máquina de destino" entra en conflicto. Para solucionarlo, simplemente elimine la configuración "Todas las opciones-> Opciones adicionales" -> "/ MÁQUINA:".
BoiseBaked
2
Esto probablemente me salvó horas. ¡Gracias!
rsp1984
3
Esta fue la solución para mí, así que solo quería decir gracias, extrañamente, ya había votado, ¡así que debo haber estado aquí antes con el mismo problema! :)
Adam Dempsey
1
Ligera variante de esta solución: algunos proyectos en mi solución no tienen "Linker" en las Propiedades de configuración. En cambio tienen "Bibliotecario". En esos casos, de hecho, Bibliotecario -> Todas las opciones -> Opciones adicionales dijo / máquina: x86 mientras que Bibliotecario -> Todas las opciones -> Máquina de destino dijo / máquina: x64. Eliminé el x86 de Librarian -> Todas las opciones -> Opciones adicionales ... y las cosas finalmente se crearon y vincularon.
Xenial
Gracias por estos consejos. Parece ser un problema común para los usuarios de CMake. Hasta el voto.
Hao Xi
54

Experimenté el mismo problema en VS2008 cuando intenté agregar una compilación X64 a un proyecto convertido de VS2003.

Miré todo lo que encontré al buscar este error en Google (máquina de destino, directorios VC ++, DUMPBIN ...) y todo parecía estar bien.

Finalmente creé un nuevo proyecto de prueba e hice los mismos cambios y parecía funcionar.

Hacer una diferencia entre los archivos vcproj reveló el problema ...

Mi proyecto convertido tenía / MACHINE: i386 establecido como opción adicional establecida en Linker-> Command Line. Por lo tanto, se establecieron dos opciones / MACHINE (x64 e i386) y se prefirió la adicional.

Eliminar esto y configurarlo correctamente en Linker-> Advanced-> Target Machine hizo que el problema desapareciera.

Zid
fuente
8
Este fue exactamente mi problema también, pero esto vino de una solución de Visual Studio que fue creada usando CMake. Parece que a CMake también le gusta agregar esta opción.
Nick Chadwick
44
Vengo de un proyecto CMake y puedo confirmar que agregó esta opción.
BeeOnRope
25

Todos los ajustes del proyecto parecían perfectos, pero aún recibí el error. Examinar el .vcxprojarchivo y buscar "x86" reveló el problema:

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

Una búsqueda / reemplazo rápido de todas las ocurrencias (diez configuraciones de archivos individuales) solucionó el problema.

lama12345
fuente
3
También en Propiedades del proyecto -> Opciones de configuración -> Bibliotecario -> Todas las opciones -> Opciones adicionales.
Xenial
13

Como el problema se debe a la diferencia en la compilación y las especificaciones de la máquina de destino (x86 y x64) Siga los pasos a continuación:

  1. Abra el proyecto C ++ que desea configurar.
  2. Elija el botón Administrador de configuración para abrir el cuadro de diálogo Administrador de configuración.
  3. En la lista desplegable Active Solution Platform, seleccione la opción para abrir el cuadro de diálogo New Solution Platform.
  4. En la lista desplegable Tipo o seleccione la nueva plataforma, seleccione una plataforma de 64 bits.

Resolvió mi problema.

hab
fuente
12

Probablemente tenga un archivo .OBJ o .LIB destinado a x64 (ese es el tipo de máquina del módulo) mientras está vinculando para x86 (ese es el tipo de máquina de destino).

Use DUMPBIN / HEADERS en sus archivos .OBJ y verifique la entrada de la máquina en el bloque FILE HEADER VALUES.

Patricio
fuente
3
Esta fue la causa principal para mí cuando encontré este mensaje de error. Anteriormente había compilado para una arquitectura y no había limpiado correctamente los archivos de objetos y las bibliotecas de esa compilación anterior. Después de eliminar todos los archivos viejos .obj y .lib de la compilación anterior, pude compilar mi proyecto con la nueva arquitectura.
Ben
Este era mi problema y la solución era limpiar antes de construir al cambiar las arquitecturas de destino.
7

En Visual Studio 2012 +/-, la página de propiedades para "Propiedades de configuración". Enlace "Línea de comando" contiene un cuadro con la etiqueta "Opciones adicionales". Si está compilando x64, asegúrese de que el cuadro no contenga / MÁQUINA: I386. Mis proyectos lo hicieron y generó el error en cuestión.

laloumen
fuente
4

Encontré este problema al construir QT. Las instrucciones que leí en alguna parte sugirieron que configure nmake usando el símbolo del sistema VS.

Elegí el símbolo del sistema x64 y realicé la configuración sin mucha molestia. Cuando probé nmake, me dio este error.

Creo que algunos de los componentes fueron preconstruidos para 32 bits. El error incluso informó qué módulos se crearon para x86.

Usé el símbolo del sistema VS predeterminado de 32 bits y funcionó.

pvairam
fuente
44
Esto me puso en el camino correcto. Si está compilando para 64 bits, puede usar este acceso directo de Windows para configurar su entorno: C: \ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat & "C: \ Archivos de programa (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat" x86_amd64 & cd c: \ YourDir La parte importante de esto es x86_amd64, sin que el entorno esté configurado como un entorno de 32 bits y qmake lo recoge como tal.
Gremwell
3

En Visual Studio 2013,

1) Verifique en las Páginas de propiedades del proyecto / Propiedades de configuración / Enlace / Todas las opciones y corrija todos los equipos y directorios configurados erróneamente.

2) Verifique en las Páginas de propiedades del proyecto / Propiedades de configuración / Enlace / Entrada y corrija todos los directorios configurados erróneamente.

Ver ejemplo de 1)

fabceolin
fuente
2

El archivo vcxproj puede contener 'MACHINE: i386' Edite el archivo vcxproj con el editor. eliminarlo!

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

Establecer la opción de compilación de 64 bits -m64 -cubin

La pista está en el registro de compilación. Me gusta esto:

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

Eso "-machine 32"es un problema

Primero configure la opción de compilación de 64 bits, luego vuelva a configurar la opción de compilación híbrida. Entonces puedes ver el éxito.

chang
fuente
1

Si su solución tiene proyectos lib, verifique la propiedad Target Machine en Property-> Librarian-> General

Rinat
fuente
1

Además de la lista de Jhonson, también verifique las carpetas de la biblioteca

En Visual Studio, seleccione Herramientas> Opciones en el menú principal. seleccione Proyectos y soluciones> Directorios VC ++. Seleccione x64 en el menú desplegable Plataforma.

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;
Igor Bárbaro
fuente
1

Esto me sucedió hoy porque había agregado un directorio de biblioteca mientras todavía estaba en modo x86, y accidentalmente eliminé los directorios heredados, haciéndolos codificados en su lugar. Luego, después de cambiar a x64, mis directorios de VC ++ siguen leyendo:

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

en lugar del _x64.

masterxilo
fuente
Gracias. Ese fue mi problema. Para futuros lectores, mi "Directorios de bibliotecas" ahora lee$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas
1

Estaba usando CMake y luego agregué una configuración win32. La página de propiedades mostraba x86, pero en realidad al abrir el archivo vcxproj en un editor de texto, ¡era x64! Cambiar manualmente a x86 resolvió esto.

gruñido
fuente
2
Tenía algo similar No sé qué configuración se escondía dónde (y seguí el consejo de la mayoría de las respuestas aquí), pero especificar el generador en consecuencia lo hizo por mí: cmake. -G "Visual Studio 12 Win 64".
user55937
1

Es un problema muy frustrante y molesto, pero una vez que lo entiendes, es bastante simple: tienes algún elemento en tu construcción que construye un tipo de arquitectura (en tu caso x64) a pesar de que ha sido objetivo de otro tipo (por ejemplo, x86 )

Puede analizar la fuente de su problema observando qué archivo obj está causando el bloqueo y comenzar a buscar el problema allí. Cada obj tendrá un código fuente analógico: ya sea en cpp, c, asm, etc. Puede haber eventos especiales de compilación a su alrededor que utilicen la herramienta incorrecta. Verifique eso en las hojas de propiedades.

Primero miraría allí antes de revisar la lista de cosas que hacer de C Johnson.


fuente
1

Resolví este problema cambiando Win32 a * 64 en Visual Studio 2013.

Salman Saleh
fuente
0

El tipo de máquina del módulo es la máquina en la que está compilando y el tipo de máquina de destino es la arquitectura x86 o x64 para la cual está construyendo sus archivos binarios.

djs
fuente
0

Este problema también puede ocurrir si su proyecto está configurado para tener los mismos directorios intermedios en Propiedades del proyecto -> Propiedades de configuración -> General

Anton K
fuente
0

En primer lugar, intente lo siguiente: 1. vaya al Administrador de configuración y cree un nuevo x64 si aún no está allí. 2. Seleccione la solución x64. 3. vaya a las propiedades del proyecto y luego Linker-> Advanced select x64 machine. 4. Ahora reconstruya la solución.

Si aún recibes el mismo error. intente una solución limpia y luego reconstruya nuevamente y abra Visual Studio, obtendrá una lista del proyecto abierto recientemente, haga clic derecho en el proyecto y retírelo de allí. Ahora ve a la solución y vuelve a abrir la solución.

Digvijay Rathore
fuente
0

esto me sucede cuando convierto mi solución VS2008 a VS2010 y cambio la configuración de win32 a X64, en mi solución anterior tengo mfcs90d.lib (Configuración-> Enlace-> Entrada-> Dependencias adicionales), ya que estoy usando VS010 acabo de comprobar en la carpeta VS2010 donde está mfcs100d.lib, así que cambié mfcs90d.lib a mfcs100d.lib en (Configuración-> Enlace-> Entrada-> Dependencias adicionales) funcionó bien.

NDestiny
fuente
0

Para aquellos que están con QT Creator, el problema es el mismo (como lo describe @ c-johnson). Asegúrese de que la configuración del compilador para MSVC en su kit esté establecida en x86 como se muestra a continuación.

Configuración del kit QT Creator para el compilador MSVC x86

Jimson Kannanthara James
fuente
0

para algunos que usan el símbolo del sistema (indicador de dos) esto podría ser útil:

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.

También si te gusta esto:

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

tienes que del * .obj antes ; para evitar confundir el enlazador con los objetos de 64 y 32 bits sobrantes de compilaciones anteriores?

kris2k
fuente
0

Muchas buenas sugerencias arriba.

Además, si está intentando construir en x86 Win32:

Asegúrese de que las bibliotecas a las que se vincula en Archivos de programa (x86) son en realidad bibliotecas x86 porque no son necesariamente ...

Por ejemplo, un archivo lib al que vinculé en C: \ Archivos de programa (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ SDK arrojó ese error, finalmente encontré una versión x86 en C: \ Archivos de programa (x86) \ Windows Kits \ 10 \ Lib \ 10.0.18362.0 \ um \ x86 y todo funcionó bien.

GrahamJ
fuente
-1

¿Qué es el sistema operativo? si se trata de un Windows x64, debe asegurarse de que CUDA x64 esté instalado y, por lo tanto, que VS2008 compile el proyecto en modo x64 ...

CUDA solo instalará x64 o x86 en Windows

Conor
fuente
Esto parece ser un error al construir e intentar vincular. Básicamente es una falta de coincidencia o inconsistencia en la configuración de compilación; la plataforma de destino que se puede especificar como parámetro para varios pasos de compilación no es coherente.
Shammi