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:
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.
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.
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.
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.
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 Manager
de Visual Studio 2010: todo se creó bien para la nueva plataforma, excepto la línea de comando del vinculador, especificada por/machine:X86
separado.fuente
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.
fuente
Todos los ajustes del proyecto parecían perfectos, pero aún recibí el error. Examinar el
.vcxproj
archivo y buscar "x86" reveló el problema:Una búsqueda / reemplazo rápido de todas las ocurrencias (diez configuraciones de archivos individuales) solucionó el problema.
fuente
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:
Resolvió mi problema.
fuente
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.
fuente
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.
fuente
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ó.
fuente
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)
fuente
El archivo vcxproj puede contener 'MACHINE: i386' Edite el archivo vcxproj con el editor. eliminarlo!
fuente
Establecer la opción de compilación de 64 bits
-m64 -cubin
La pista está en el registro de compilación. Me gusta esto:
Eso
"-machine 32"
es un problemaPrimero 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.
fuente
Si su solución tiene proyectos lib, verifique la propiedad Target Machine en Property-> Librarian-> General
fuente
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.
fuente
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.
fuente
$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
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.
fuente
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
Resolví este problema cambiando Win32 a * 64 en Visual Studio 2013.
fuente
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.
fuente
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
fuente
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.
fuente
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.
fuente
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.
fuente
para algunos que usan el símbolo del sistema (indicador de dos) esto podría ser útil:
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?
fuente
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.
fuente
¿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
fuente