visual-c++ - x32 - microsoft visual c++ 2012
error fatal LNK1112: tipo de máquina de módulo ''x64'' entra en conflicto con el tipo de máquina de destino ''X86'' (21)
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 la biblioteca vinculados están compilados en la plataforma x86, pero cuando los compilo, recibo el mensaje de error "error fatal LNK1112: 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ó. Por favor dígame: ¿qué es "tipo de máquina de módulo" y qué es "tipo de máquina de destino"? ¿Cómo puedo superarlo?
¿Cuál es el sistema operativo? si es una ventana x64, entonces 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
Además de la lista de C Johnson , agregaría el siguiente punto:
Comprobar en Visual Studio:
Propiedades del proyecto -> Propiedades de configuración -> Enlazador -> Línea de comando.
"Opciones adicionales" NO debe contener /machine:X86
Tengo esa clave, generada por CMake: CMake generó el proyecto x86, luego agregué la plataforma x64 a través de Configuration Manager
en Visual Studio 2010: todo se creó bien para la nueva plataforma excepto la línea de comandos del enlazador, especificado /machine:X86
separado.
Además de la lista de Jhonson, también revise las carpetas de la biblioteca
En Visual Studio, seleccione Herramientas> Opciones en el menú principal. seleccione Proyectos y soluciones> Directorios de VC ++. Seleccione x64 desde el menú desplegable Plataforma.
$(VCInstallDir)lib/AMD64;
$(VCInstallDir)atlmfc/lib/amd64;
$(WindowsSdkDir)lib/x64;
Antes que nada, intente lo siguiente: 1. Entregar el Administrador de configuración y crear un nuevo x64 si aún no está allí. 2. selecciona la solución x64. 3. vaya a las propiedades del proyecto y luego Linker-> Advanced select x64 machine. 4. Ahora reconstruye la solución.
Si todavía estás obteniendo el mismo error. prueba una solución limpia y luego vuelve a compilar y abre Visual Studio. Recibirás la lista del proyecto abierto recientemente, haz clic derecho en el proyecto y quítalo de allí. Ahora vaya a la solución y vuelva a abrir la solución nuevamente.
Dado que 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:
- Abra el proyecto C ++ que desea configurar.
- Elija el botón Administrador de configuración para abrir el cuadro de diálogo Administrador de configuración.
- En la lista desplegable de la Plataforma de soluciones activas, seleccione la opción para abrir el cuadro de diálogo Nueva plataforma de soluciones.
- En la lista desplegable Tipo o seleccione la nueva plataforma, seleccione una plataforma de 64 bits.
Solucionó mi problema.
El archivo vcxproj puede contener ''MACHINE: i386'' Editar el archivo vcxproj con el editor. eliminarlo!
El tipo de máquina de 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 binarios.
En Visual Studio 2012 +/-, la página de propiedades para "Propiedades de configuración". Enlace. "Línea de comando" contiene un cuadro etiquetado como "Opciones adicionales". Si está compilando x64, asegúrese de que el cuadro no contenga / MÁQUINA: I386. Mis proyectos sí y generó el error en cuestión.
En Visual Studio 2013,
1) Compruebe en las páginas de propiedades del proyecto / Propiedades de configuración / Enlazador / Todas las opciones y corrija todas las máquinas y directorios configurados incorrectamente.
2) Compruebe en las páginas de propiedades del proyecto / Propiedades de configuración / Enlazador / Entrada y corrija todos los directorios configurados erróneamente.
Ver ejemplo de 1)
Es probable que tenga un archivo .OBJ o .LIB que esté destinado a x64 (ese es el tipo de máquina de módulo) mientras enlaza para x86 (ese es el tipo de máquina de destino).
Utilice DUMPBIN / HEADERS en sus archivos .OBJ y verifique la entrada de la máquina en el bloque VALUE HEADER VALUES.
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 para otro tipo (digamos x86 )
Puede diseccionar el origen de su problema mirando 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 de compilación especiales a su alrededor que estén usando la herramienta incorrecta. Verifique eso en las hojas de propiedades.
Me gustaría ver primero antes de pasar por la lista de cosas que hacer de C Johnson.
Escribí una entrada en el blog sobre esto, cuando me encontré con este enloquecedor problema, y finalmente volví a poner mi sistema en funcionamiento.
Estas son las cosas para verificar, en este orden:
Verifique sus opciones de propiedades en la configuración del vinculador 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.
Seleccione Build> Configuration Manager desde 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 compilar x64, pero un proyecto individual en la solución se puede configurar para apuntar a win32. Así que sí, el estudio visual deja mucha cuerda para colgarse, pero así es la vida.
Verifique los archivos de su biblioteca que realmente son del tipo de plataforma que tienen como objetivo. Esto se puede usar utilizando dumpbin.exe que se encuentra en el directorio de Visual Studio VC / bin. usa la opción -headers para volcar todas tus funciones. Busque la entrada de la máquina para cada función. debe incluir x64 si es una compilación de 64 bits.
En Visual Studio, seleccione Herramientas> Opciones en el menú principal. seleccione Proyectos y soluciones> Directorios de VC ++. Seleccione x64 desde el menú desplegable Plataforma. Asegúrese de que la primera entrada sea: $ (DirInstal de VCI) / bin / x86_amd64 seguido de $ (DirInstal de VCI) / bin .
Una vez que hice el paso 4 todo funcionó de nuevo para mí. La cuestión es que estaba encontrando este problema en todos mis proyectos en los que quería compilar para alcanzar un objetivo de 64 bits.
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 solucionó esto.
Este problema también puede ocurrir si su proyecto se configuró para tener los mismos directorios intermedios en Propiedades del proyecto -> Propiedades de configuración -> General
Esto me sucedió hoy porque había agregado un directorio de biblioteca mientras aún 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 ++ aún leen:
"...; $ (VC_LibraryPath_x86); $ (WindowsSDK_LibraryPath_x86);"
en lugar de _x64.
Experimenté el mismo problema en VS2008 cuando intenté agregar una versión X64 a un proyecto convertido desde VS2003.
Miré todo lo que encontré al buscar este error en Google (máquina de destino, directorios de VC ++, DUMPBIN ...) y todo parecía estar bien.
Finalmente, creé un nuevo proyecto de prueba e hice los mismos cambios, y pareció funcionar.
Hacer una diferencia entre los archivos vcproj reveló el problema ...
Mi proyecto convertido tenía / MACHINE: i386 configurado como una opción adicional establecida en Linker-> Command Line. Por lo tanto, había dos / opciones de MÁQUINA configuradas (tanto x64 como i386) y la adicional tenía preferencia.
Al eliminar esto y configurarlo correctamente en Enlazador-> Avanzado-> Máquina de destino, el problema desapareció.
Me encontré con este problema al construir QT. Las instrucciones que leí en algún lugar sugirieron que configuré nmake usando el símbolo del sistema de 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 construyeron para x86.
Utilicé el símbolo del sistema VS predeterminado de 32 bits y funcionó.
Si su solución tiene proyectos lib, verifique la propiedad de Máquina de destino en Propiedad-> Bibliotecario-> General
Todos los ajustes del proyecto parecían perfectos, pero todavía tengo el error. Mirar el archivo .vcxproj
y buscar "x86" reveló el problema:
<Lib>
<AdditionalOptions> /machine:X86 %(AdditionalOptions)</AdditionalOptions>
</Lib>
Una búsqueda / reemplazo rápido para todas las ocurrencias (diez configuraciones de archivos individuales) corrigió el problema.
esto me pasa 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-> Enlazador-> Entrada-> Dependencias adicionales), ya que estoy usando VS010 acabo de verificar en la carpeta VS2010 donde está mfcs100d.lib, así que cambié mfcs90d.lib a mfcs100d.lib en (Configuración-> Enlazador-> Entrada-> Dependencias adicionales) funcionó bien.
"project property - CUDA Runtime API - GPU - NVCC Compilation Type"
Establezca 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 ~~~~~
Ese "-machine 32"
es un problema.
Primero establezca la opción de compilación de 64 bits, luego establezca la opción de compilación híbrida. Entonces puedes ver el éxito.