web-dev-qa-db-fra.com

problème de liaison: erreur irrécupérable LNK1112: le type de machine du module 'x64' est en conflit avec le type de machine cible 'X86'

Je suis en train d'exécuter un exemple d'application depuis la bibliothèque wxFreeChart. Après compilation sur la liaison, il y a une erreur:

wxcode_msw28d_freechart.lib(wxfreechart_lib_xydataset.obj) : fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'

J'ai essayé de passer option de l'éditeur de liens\avancé\machine cible à MachineX64 mais cela ne fonctionne pas.

J'utilise Visual Studio 2008, une suggestion?

merci pour l'aide

24
gruber

L'erreur est explicite, vous essayez de lier des bibliothèques compilées avec différentes cibles de CPU. Une image exécutable ne peut contenir que du code pur x86 (32 bits) ou pur x64 (64 bits). Le mélange n'est pas possible.

Vous modifiez la CPU cible en créant une nouvelle configuration pour le projet. Changer le paramètre de l'éditeur de liens n'est pas suffisant. Build + Configuration Manager, combo Plate-forme de solution active en haut à droite, choisissez Nouveau, puis sélectionnez x64. Cela crée une nouvelle configuration avec plusieurs paramètres de projet modifiés, principalement le compilateur qui sera utilisé.

Attention, avant VS2010, les compilateurs 64 bits sont non installés par défaut. Si vous ne voyez pas x64 dans la liste déroulante des plates-formes, vous devrez réexécuter setup.exe et activer l'option permettant d'installer les compilateurs 64 bits. Ensuite, relancez également tout programme d'installation de service pack que vous avez éventuellement appliqué.

Une approche possible avec moins de difficultés consiste à utiliser la version 32 bits de la bibliothèque.

33
Hans Passant

Je suis tombé dessus aussi et j'ai trouvé une solution.

D'abord sur la façon dont j'ai eu ce problème. J'ai un projet qui construit en x86. Ensuite, j'ai utilisé le Gestionnaire de configuration pour ajouter x64, et j'ai rencontré ce problème.

En examinant attentivement BuildLog.htm, j'ai constaté que ces deux options étaient répertoriées dans l'éditeur de liens:

/MACHINE:X64  
/machine:X86 

Je ne pouvais trouver aucun endroit dans la boîte de dialogue Pages de propriétés où je pouvais changer cela. J'ai donc ouvert le fichier .vcproj et cherché la ligne appropriée.

AdditionalOptions=" /STACK:10000000 /machine:x64 /debug"

et problème résolu.

17
l00g33k

Dans mon cas, il semble que ce soit parce que j'avais "copié les paramètres" d'une configuration 32 bits vers une nouvelle configuration (64 bits) et que les bibliothèques n'avaient pas été mises à jour. Impair. 

1> MSVCRTD.lib (ti_inst.obj): erreur irrécupérable LNK1112: le type d’ordinateur du module «X86» entre en conflit avec le type d’ordinateur cible «x64».

cela signifiait que «vos propriétés -> répertoires VC++ -> répertoires de bibliothèque» désignent un répertoire contenant des bibliothèques 32 bits. Fix en quelque sorte!

Dans mon cas http://social.msdn.Microsoft.com/Forums/ar/vcgeneral/thread/c747cd6f-32be-4159-b9d3-d2e33d2bab55

ref: http://betterlogic.com/roger/2012/02/visual-studio-2010-express-64-bit-woe

5
rogerdpack

Sélectionnez Propriétés du projet -> Propriétés de configuration -> Bibliothécaire Définissez l’ordinateur cible sur MachineX64 (/ MACHINE: X64)

5
Joseph

Le problème étant dû à la différence entre la compilation et les spécifications de la machine cible (x86 et x64), procédez comme suit:

  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.

2
hab

Essayez de modifier chaque occurrence de.\Release en.\X64\Release dans les propriétés x64. Au moins cela a fonctionné pour moi ...

1
Thomas

Merci pour les réponses les gars. Mon problème était que j'ai changé une solution x64 dans Visual Studio en 32 bits uniquement dans le Gestionnaire de configuration. J'ai fini par créer une nouvelle solution au format 32 bits, puis à copier mon code C++ et cette erreur a disparu. Je pense que les suggestions de l00g33k et de RogerAttrill étaient peut-être la solution, mais les miennes ont également fonctionné.

0
JoeC

Récemment, j'ai aussi rencontré ce problème. C'est parce que j'ai utilisé qt (x64) dans vs win32. Si vous voulez utiliser qt application x64, vous pouvez choisir vs x64-- comme ci-dessus. Si vous voulez utiliser win32 et peut-être que non, vous devez télécharger qt (32bit), puis définir correctement votre environnement, tel que le répertoire lib, etc. (remarque: vous êtes peut-être déjà défini dans x64(other version), si vous convertissez votre win32 ou x64 en un autre, Additional Dependencies inclut l'ancien répertoire!)

0
Crawl.W

en me basant sur ces réponses - je devais également modifier une référence X86 sous Bibliothécaire -> Ligne de commande -> Options supplémentaires (pour la plate-forme x64)

0
Kevin Afanasiff

Je sais que c'est un peu vieux, mais je pensais donner un autre conseil . Dans ma situation, j'ai hérité de cette application que je devais maintenir . Le projet VS2008 est venu avec la même chaîne en C/C++ - > OutputFIles -> "ObjectFIleName" et "Nom de fichier de la base de données du programme" (pour les deux plates-formes Win32 et x64) . Ainsi, lorsque j'ai construit la plate-forme Win32, la construction s'est bien déroulée, mais lorsque j'ai essayé de construire x64, j'ai eu l'erreur:

\ Debug64\Objects\common.obj: Erreur irrécupérable LNK1112: le type de machine du module 'X86' est en conflit avec le type de machine cible 'x64'

Évidemment, les deux patforms stockaient common.obj au même endroit. Ainsi, lorsque j'ai essayé de construire x64, l'éditeur de liens a pris le fichier objet existant, qui était x86.

Pour résoudre ce problème, je viens de remplacer la chaîne existante par la macro "$ (IntDir) \" pour x64 (sans guillemets) et je me suis assuré que la macro était résolue dans le chemin correct, comme dans le reste des projets. Cela a résolu mon problème.

0
falconK

Ce problème n'a rien à voir avec l'éditeur de liens, donc sa modification n'affectera pas le résultat. Vous l'obtenez parce que je suppose que vous essayez de cibler x86 mais que, pour une raison ou une autre, wxcode_msw28d_freechart.lib est en cours de création sous la forme d'un fichier x64.

Essayez de regarder wxcode_msw28d_freechart.lib et son code source. Votre problème se passe là-bas. Vérifiez si certaines étapes de construction spéciales utilisent le mauvais ensemble d’outils (x64 au lieu de x86).

0
user7484190

Mise à jour des réponses de i00g et Thomas, cette fois pour VS2012 (certains noms ont été modifiés). Après avoir copié les paramètres x86 dans une cible x64 à l'aide du gestionnaire de configuration, le problème se pose pour la même raison que précédemment (les cibles lib ne sont pas correctes dans la configuration x64). Ouvrez votre .vcxproj (éditeur de texte) et remplacez MachineX86 par MachineX64, le cas échéant. (Je n'ai toujours pas trouvé où cela se trouve sur les feuilles de propriétés ....) Cela ne semble être nécessaire qu'avec les bibliothèques statiques.

0
Josh

avant de passer à l'étape " compile -DIPLIB = NONE filename.cxx " Prenez le chemin de l'installation de VIsual Studio jusqu'au fichier de commandes vcvarsall et modifiez la configuration comme indiqué ci-dessous.

* C:\apps\MVS9\VC\vcvarsall.bat x86_AMD64 *

maintenant la prochaine étape devrait être

compile -64bit -DIPLIB = none nomfichier.cxx

cela a résolu le problème pour moi

0
pratap