web-dev-qa-db-fra.com

erreur fatale LNK1112: le type de machine du module 'x64' est en conflit avec le type de machine cible 'X86'

J'utilise CUDA (VC++, Visual studio 2008sp1) pour déboguer un programme FEM. Le programme ne peut s'exécuter que sur une plate-forme Win32, pour l'insuffisance de cuda. Je pense que les fichiers de bibliothèque liés sont tous compilés sur la plate-forme x86, mais lorsque je le compile, le message d'erreur "Erreur irrécupérable LNK1112: le type de machine du module 'x64' entre en conflit avec le type de machine cible 'X86'". 

J'ai essayé de convertir la plate-forme en x64, mais cela n'a pas fonctionné. Dites-moi, qu'est-ce qu'un "type de machine modulaire" et un "type de machine cible"? Comment puis-je le surmonter?

154
user430382

J'ai écrit une entrée blog à ce sujet, alors que je rencontrais ce problème accablant, et finalement je remettais mon système en état de marche.

Ce sont les choses à vérifier, dans cet ordre:

  1. Vérifiez les options de propriétés dans les paramètres de l’éditeur de liens sous: Propriétés> Propriétés de configuration> Éditeur de liens> Avancé> Ordinateur cible. Sélectionnez MachineX64 si vous ciblez une version 64 bits ou MachineX86 si vous créez une version 32 bits.

  2. Sélectionnez Build> Configuration Manager dans le menu principal de visual studio. Assurez-vous que la plate-forme correcte de votre projet est spécifiée. Il est possible que IDE soit défini pour générer x64, mais un projet individuel de la solution peut être défini pour cibler win32. Alors oui, Visual Studio laisse beaucoup de corde pour se pendre, mais c'est la vie.

  3. Vérifiez que les fichiers de votre bibliothèque correspondent bien au type de plate-forme que vous ciblez. Cela peut être utilisé en utilisant dumpbin.exe qui se trouve dans votre répertoire VC\bin de visual studio. utilisez l'option -headers pour vider toutes vos fonctions. Recherchez l'entrée de la machine pour chaque fonction. il devrait inclure x64 s'il s'agit d'une version 64 bits.

  4. Dans Visual Studio, sélectionnez Outils> Options dans le menu principal. sélectionnez Projets et solutions> Répertoires VC++. Sélectionnez x64 dans le menu déroulant Plate-forme. Assurez-vous que la première entrée est: $ (VCInstallDir)\bin\x86_AMD64 suivi de $ (VCInstallDir)\bin.

Une fois que j'ai fait l'étape 4, tout a encore fonctionné pour moi. Le problème était que je rencontrais ce problème sur tous mes projets où je voulais compiler vers une cible 64 bits. 

217
C Johnson

En plus de la liste C Johnson, je voudrais ajouter le point suivant:

Vérifier dans Visual Studio:
Propriétés du projet -> Propriétés de configuration -> Éditeur de liens -> Ligne de commande.

"Options supplémentaires" ne doit PAS contenir /machine:X86

J'ai cette clé, générée par la sortie CMake: CMake projet x86 généré, puis j’ai ajouté la plate-forme x64 via Configuration Manager dans Visual Studio 2010 - tout était parfait pour la nouvelle plate-forme, sauf la ligne de commande de l’éditeur de liens, spécifiée /machine:X86 séparément.

109
sergtk

J'ai rencontré le même problème dans VS2008 lorsque j'ai essayé d'ajouter une version X64 à un projet converti à partir de VS2003.

J'ai tout regardé lors de la recherche de cette erreur sur Google (machine cible, répertoires VC++, DUMPBIN, etc.) et tout se passait bien.

Finalement, j'ai créé un nouveau projet de test et fait les mêmes changements et cela a semblé fonctionner.

Faire un diff entre les fichiers vcproj a révélé le problème ....

Mon projet converti avait/MACHINE: i386 défini comme option supplémentaire définie sous Linker-> Ligne de commande. Ainsi, deux options/MACHINE ont été définies (x64 et i386) et la dernière a pris la préférence.

Le fait de le supprimer et de le configurer correctement dans l'éditeur de liens-> Avancé-> Machine cible a fait disparaître le problème.

51
Zid

Tous les paramètres du projet semblaient parfaits, mais j'ai quand même eu l'erreur. L'examen du fichier .vcxproj et la recherche de "x86" ont révélé le problème:

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

Une recherche/remplacement rapide de toutes les occurrences (dix paramètres de fichier individuels) a résolu le problème.

18
lama12345

Le problème étant dû à la différence entre la compilation et les spécifications de la machine cible (x86 et x64) Suivez les étapes ci-dessous: 

  1. Ouvrez le projet C++ que vous souhaitez configurer.
  2. Cliquez sur le bouton Gestionnaire de configuration pour ouvrir la boîte de dialogue Gestionnaire de configuration.
  3. Dans la liste déroulante Active Solution Platform, sélectionnez l'option permettant d'ouvrir la boîte de dialogue Nouvelle solution.
  4. Dans la liste déroulante Type ou sélectionnez la nouvelle plate-forme, sélectionnez une plate-forme 64 bits.

Cela a résolu mon problème.

11
hab

Vous avez probablement un fichier .OBJ ou .LIB ciblé pour x64 (c'est le type d'ordinateur du module) pendant que vous liez pour x86 (c'est le type d'ordinateur cible).

Utilisez DUMPBIN/HEADERS sur vos fichiers .OBJ et recherchez l’entrée de la machine dans le bloc FILE HEADER VALUES.

11
Patrick

Dans Visual Studio 2012 +/-, la page de propriétés de "Propriétés de configuration", "Ligne de commande", contient une zone intitulée "Options supplémentaires". Si vous créez x64, assurez-vous que cette zone ne contient pas/MACHINE: I386 Mes projets l'ont fait et cela a généré l'erreur en question.

5
laloumen

Dans Visual Studio 2013, 

1) Vérifiez dans les pages de propriétés du projet/Propriétés de configuration/Éditeur de liens/Toutes les options et corrigez tous les ordinateurs et répertoires configurés manquants.

2) Vérifiez dans les pages de propriétés du projet/Propriétés de configuration/Éditeur de liens/Entrée et corrigez tous les répertoires configurés manquants.

Voir exemple de 1)

3
fabceolin

Je suis tombé sur ce problème lors de la construction de QT. Les instructions que j'ai lues quelque part m'ont suggéré de configurer nmake à l'aide de l'invite de commande VS.

J'ai choisi l'invite de commande x64 et effectué configurer sans tracas. Lorsque j'ai essayé nmake, cette erreur s'est produite. 

Je pense que certains des composants ont été pré-construits pour 32 bits. L'erreur a même indiqué quels modules ont été construits pour x86. 

J'ai utilisé l'invite de commande VS 32 bits par défaut et cela a fonctionné. 

3
pvairam

J'utilisais CMake et j'ai ensuite ajouté une configuration win32. La page de propriétés montrait x86 mais en fait, lors de l’ouverture du fichier vcxproj dans un éditeur de texte, c’était x64! Changer manuellement en x86 a résolu ce problème.

1
grunt

le fichier vcxproj peut contenir 'MACHINE: i386' Editez le fichier vcxproj avec l'éditeur. retirez-le!

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

Définir l'option de compilation 64 bits -m64 -cubin

L'allusion est à compiler log . Comme ceci:

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

Ce "-machine 32" est un problème.

Commencez par définir l’option de compilation 64 bits.

1
chang

Cela m’est arrivé aujourd’hui parce que j’avais ajouté un répertoire de bibliothèque en mode x86 et que j’avais accidentellement supprimé les répertoires hérités, les codant ainsi en dur . Puis, après le passage à x64, mes répertoires VC++ étaient toujours lus:

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

au lieu du _x64.

1
masterxilo

Si votre solution a des projets lib, vérifiez la propriété de la machine cible dans la propriété-> Bibliothécaire-> Général

1
Rinat

C'est un problème très frustrant et énervant, mais une fois que vous l'avez compris, c'est très simple: vous avez un élément dans la construction de ce type d'architecture (dans votre cas, x64) bien que ciblé par un autre type ).

Vous pouvez disséquer la source de votre problème en consultant le fichier obj à l'origine du crash et en recherchant le problème. Chaque obj aura un code source analogique: soit dans cpp, c, asm, etc. Il peut y avoir des événements de construction spéciaux autour de lui qui utilisent le mauvais outil. Vérifiez cela dans les feuilles de propriétés. 

Je regarderais d'abord là-bas avant de passer en revue la liste de choses à faire de C Johnson.

1
user7484190

En plus de la liste de Jhonson, vérifiez également les dossiers de la bibliothèque

Dans Visual Studio, sélectionnez Outils> Options dans le menu principal. sélectionnez Projets et solutions> Répertoires VC++. Sélectionnez x64 dans le menu déroulant Plate-forme.

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\AMD64;
$(WindowsSdkDir)lib\x64;
1
Igor Barbarian

  J'ai résolu ce problème en modifiant Win32 en * 64 dans Visual Studio 2013.

0
Salman Saleh

module type machine est la machine sur laquelle vous compilez et le type machine cible est l'architecture x86 ou x64 pour laquelle vous créez vos fichiers binaires 

0
djs

pour certaines personnes, à l'aide de l'invite de commande (invite de commandes), cela peut être 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.

Aussi, si vous aimez ça:

CL "% 1% 2% 3"/EHsc/link user32.lib Gdi32.lib Winmm.lib comctl32.lib *. Obj/SOUS-SYSTEME: CONSOLE/MACHINE: x86

vous devez supprimer * .obj avant; éviter de confondre l'éditeur de liens avec les objets 64 et 32 ​​bits laissés par les compilations précédentes?

0
kris2k

Pour ceux qui utilisent QT Creator, le problème est le même (comme décrit par @ c-johnson). Assurez-vous que les paramètres du compilateur pour MSVC dans votre kit sont définis sur x86, comme indiqué ci-dessous.

QT Creator Kit Settings for MSVC x86 compiler

Tout d’abord, essayez les choses suivantes: 1. Allez dans Configuration Manager et créez un nouveau x64 s’il n’y en a pas déjà une .. 2. sélectionnez la solution x64 . 3. Allez dans les propriétés du projet, puis dans l'éditeur de liens -> Avancé, sélectionnez x64 machine . 4. Reconstruisez maintenant la solution.

Si vous obtenez toujours la même erreur. essayez la solution propre, puis reconstruisez à nouveau et ouvrez visual studio. Vous obtiendrez la liste des projets récemment ouverts, effectuez un clic droit sur le projet et supprimez-le. Maintenant, allez à la solution et rouvrez-la à nouveau.

0
Digvijay Rathore

cela m’arrive lorsque je convertis ma solution VS2008 en VS2010 et que je modifie la configuration de win32 en X64. Dans mon ancienne solution, j’ai mfcs90d.lib (Configuration-> Linker-> Entrée-> Dépendances supplémentaires), car j’utilise VS010 j’ai juste vérifié dans le dossier VS2010 où il est mfcs100d.lib, j'ai donc changé mfcs90d.lib en mfcs100d.lib dans (Configuration-> Linker-> Entrée-> Dépendances supplémentaires) cela fonctionnait bien. 

0
NDestiny

Ce problème peut également se produire si votre projet est configuré pour avoir les mêmes répertoires intermédiaires dans Propriétés du projet -> Propriétés de configuration -> Général

0
Anton K