2010-05-17 3 views
21

Je tente d'exécuter l'exemple d'application à partir de la bibliothèque wxFreeChart. Après la compilation sur la liaison il y a une erreur: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'

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 changer l'option de linker \ machine cible avancée de \ à MachineX64 mais cela ne fonctionne pas.

Im utilisant visual studio 2008, aucune suggestion?

grâce à l'aide

+0

Êtes-vous sur une architecture 32 ou 64 bits? –

+0

Pouvez-vous décrire "... ça ne marche pas." avec quelques mots de plus, s'il vous plaît? –

+0

cela signifie qu'il existe la même erreur – gruber

Répondre

32

L'erreur est explicite, vous essayez de relier les bibliothèques qui ont été compilées avec différentes cibles 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, seul le changement du paramètre de l'éditeur de liens n'est pas suffisant. Build + Configuration Manager, Combinaison de la plate-forme de la solution active en haut à droite, choisissez Nouveau et sélectionnez x64. Cela crée une nouvelle configuration avec plusieurs paramètres de projet modifiés, le plus important étant le compilateur qui sera utilisé.

Attention, avant le VS2010, les compilateurs 64 bits sont et non installés par défaut. Si vous ne voyez pas x64 dans la liste déroulante de la plate-forme, vous devrez réexécuter setup.exe et activer l'option d'installation des compilateurs 64 bits. Ensuite, exécutez à nouveau tous les programmes d'installation du Service Pack que vous avez éventuellement appliqués.

Une approche possible avec moins de points de douleur consiste à utiliser la version 32 bits de la bibliothèque.

+0

son logique mais j'ai compilé ces bibliothèques sur windows en utilisant makefile avec (je pense) des paramètres par défaut avec l'architecture 32 bits. – gruber

+0

Hmm, évitez de faire des hypothèses lorsque vous obtenez des erreurs que vous ne pouvez pas expliquer. –

+0

J'ai expliqué mon erreur, Vous ne connaissez pas la réponse, puis ne répondez pas – gruber

1

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

16

Je me suis heurté à cela aussi et trouvé une solution.

D'abord sur comment j'ai eu ce problème. J'ai un projet qui construit en x86. Ensuite, j'utilise le gestionnaire de configuration pour ajouter x64, et j'ai rencontré ce problème.

En regardant attentivement BuildLog.htm, je vois ces deux répertorié comme options de l'éditeur de liens: /MACHINE: X64
/machine: X86

Je ne peux pas trouver où dans la boîte de dialogue Pages de propriétés où Je peux changer cela, donc j'ouvre le fichier .vcproj et cherche la ligne appropriée et la change en: AdditionalOptions = "/ STACK: 10000000/machine: x64/debug"

et cela fonctionne.

+4

Cette réponse m'a aidé à trouver une solution dans mon cas où une chose très similaire se produisait sur un projet différent que j'essayais de convertir de 32 à 64 bits. Il s'avère que j'avais manqué de convertir un paramètre explicite/machine: X86 dans les options supplémentaires à/machine: x64 –

+0

A travaillé pour moi aussi. Avec la méthode mentionnée par 'Hans Passant', vous devrez peut-être définir à nouveau certaines dépendances et propriétés (que vous avez définies plus tôt). – Annie

+7

btw, les "AdditionalOptions" peuvent être trouvés dans l'interface graphique sous Linker/Ligne de commande/Options supplémentaires –

5

Dans mon cas, il semble que c'était parce que j'avais "copié les paramètres" d'une 32 bits à une nouvelle configuration (64 bits) et il n'avait pas mis à jour les bibliothèques. Impair.

1> MSVCRTD.lib (ti_inst.obj): LNK1112 d'erreur fatale: type de machine de module de conflits 'X86' avec le type de machine cible 'x64'

cela signifiait « vos propriétés -> Annuaires VC++ -> Répertoires de bibliothèques "Pointe vers un répertoire qui contient des bibliothèques de 32 bits. Correction 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

0

Je sais que c'est un peu vieux, mais je pensais que je fournirais une autre astuce. 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 "Program Database File Name" (pour les deux plates-formes Win32 et x64). Alors quand j'ai construit la plate-forme Win32, il a bien construit, mais quand j'ai essayé de construire x64, j'ai l'erreur:

\ Debug64 \ Objects \ common.obj: erreur fatale LNK1112: le type de machine du module 'X86' est en conflit avec Le type de machine cible 'x64'

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

Pour réparer je viens de remplacer la chaîne existante par la macro "$ (IntDir) \" pour x64 (sans guillemets), et fait en sorte que la macro résolue au bon chemin, comme dans le reste des projets. Cela a résolu mon problème.

0

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

0

avant d'aller pour l'étape « compilation -DIPLIB = AUCUN filename.cxx » prendre le chemin de l'installation VIsual Studio jusqu'à le fichier batch vcvarsall et modifier la configuration comme indiqué ci-dessous.

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

maintenant la prochaine étape devrait être

compilation -64bit -DIPLIB = aucun filename.cxx

cette résolu le problème pour moi

5

Accédez aux propriétés du projet-> Propriétés de configuration -> Librarian Définir Machine cible à MachineX64 (/ MACHINE: X64)

1

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

  1. Ouvrez le projet C++ que vous souhaitez configurer.
  2. Choisissez 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 New Solution Platform.
  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.

0

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

0

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

0

Ce problème n'a rien à voir avec l'éditeur de liens, donc modifier son réglage n'affectera pas le résultat. Vous obtenez cela parce que je suppose que vous essayez de cibler x86 mais pour une raison ou une autre wxcode_msw28d_freechart.lib est en cours de construction en tant que fichier x64. Essayez de regarder wxcode_msw28d_freechart.lib et quel que soit le code source dont il dérive. Votre problème se passe là-bas. Voyez s'il existe des étapes de construction spéciales qui utilisent le mauvais ensemble d'outils (x64 au lieu de x86).