erreur fatale LNK1112: module type de machine 'x64 conflits avec la cible type de machine 'X86'
Je suis en utilisant CUDA (VC++, Visual studio 2008sp1) pour déboguer une FEM programme. Le programme ne peut s'exécuter sur une plate-forme Win32, de l'insuffisance de cuda. Je pense que la bibliothèque de fichiers liés sont compilés sur la plate-forme x86, mais quand je compile, j'obtiens le message d'erreur "erreur fatale LNK1112: module type de machine 'x64 conflits avec la cible type de machine 'X86'".
J'ai essayé de convertir la plate-forme pour les systèmes x64, mais il ne fonctionne pas. S'il vous plaît dites-moi: qu'est-ce que le module "type de machine" et qu'est-ce que "la cible type de machine"? Comment puis-je vaincre?
Vous devez vous connecter pour publier un commentaire.
J'ai écrit un blog entrée à ce sujet, que j'ai rencontré ce affolant problème, et enfin arracha mon système en ordre de marche.
Ce sont les choses à vérifier, dans cet ordre:
Vérifiez vos options des propriétés dans votre éditeur de liens paramètres: Propriétés > Propriétés de Configuration > Linker > Avancé > de la Machine Cible. Sélectionnez MachineX64 si vous utilisez une version 64 bits, ou MachineX86 si vous faites un 32 bits.
Sélectionnez Build > Gestionnaire de Configuration dans le menu principal de visual studio. Assurez-vous que votre projet a la bonne plate-forme spécifiée. Il est possible pour l'IDE d'être ensemble pour construire x64 mais un projet individuel dans la solution peut être réglé pour cible win32. Donc oui, visual studio et laisse beaucoup de corde pour se pendre, mais c'est la vie.
Vérifier vos fichiers de la bibliothèque qu'ils sont vraiment le type de plate-forme cible. Ceci peut être utilisé en utilisant dumpbin.exe qui est dans votre visual studio de CR\bin. utiliser les en-têtes option de vider toutes vos fonctions. Recherchez l'entrée des machines pour chaque fonction. il devrait inclure x64 si c'est un 64 bits.
Dans visual studio, sélectionnez Outils > Options à partir du menu principal. sélectionner les Projets et les Solutions > Répertoires de VC++. Sélectionnez x64 à partir de la Plate-forme de liste déroulante. Assurez-vous que la première entrée est: $(VCInstallDir)\bin\x86_amd64 suivie par $(VCInstallDir)\bin.
Une fois j'ai fait l'étape 4, tout a fonctionné de nouveau pour moi. La chose était que j'étais confronté à ce problème sur tous mes projets où j'ai voulu compiler vers une version 64 bits de la cible.
Configuration Properties > Librarian > General > Target Machine
. Pas sûr si je devrais modifier l'original de la réplique pour cela, espérons que les informations se trouvent ici-bas.x64
pour Gestionnaire de Configuration, vous pouvez créer une nouvelle plate-forme.En plus de C Johnson liste, je voudrais ajouter le point suivant:
Vérifier dans Visual Studio:
Propriétés du projet -> Propriétés de Configuration -> Linker -> ligne de Commande.
"Options supplémentaires" ne doit PAS contenir de
/machine:X86
J'ai une telle clé, généré par CMake sortie: CMake généré x86 projet, puis j'ai ajouté de la plate-forme x64 via
Configuration Manager
dans Visual Studio 2010 - tout a été créé pour la nouvelle plate-forme, sauf que la ligne de commande liens, spécifié/machine:X86
séparément.J'ai eu le même problème dans VS2008 quand j'ai essayé d'ajouter une version X64 pour un projet converti à partir VS2003.
J'ai regardé tout trouvé lors de la recherche pour cette erreur sur Google (de la machine Cible, Répertoires de VC++, DUMPBIN....) et tout avait l'air OK.
Enfin, j'ai créé un nouveau projet de test et fit de même des changements et ça semblait fonctionner.
De faire un diff entre la vcproj fichiers a révélé le problème....
Mon projet converti a /MACHINE:i386 définir comme option supplémentaire définie sous l'éditeur de liens->Ligne de Commande. Ainsi, il y a deux /MACHINE de jeu d'options (les deux x64 et i386) et les autres un qui a eu la préférence.
La suppression de ce et en le configurant correctement sous l'éditeur de liens->Avancé>Machine Cible, le problème a disparu.
Tous les paramètres du projet semblait parfait, mais j'ai toujours le message d'erreur. La recherche dans le
.vcxproj
fichier et de la recherche pour "x86", a révélé le problème:Une rapide recherche/remplacer pour tous les occurrances (dix paramètres du fichier individuel) a résolu le problème.
Puisque le problème est dû à la différence dans la compilation et la cible spécifications de la machine (x86 & x64)
Suivez les étapes ci-dessous:
Il a résolu mon problème.
Vous avez probablement un .OBJ ou .Fichier LIB qui est ciblé pour les systèmes x64 (c'est le module du type de machine) alors que vous êtes de liaison pour les architectures x86 (qui est la cible du type de machine).
Utilisation DUMPBIN /en-TÊTES, sur votre .Les fichiers OBJ et de vérifier pour la machine d'entrée dans le FICHIER d'en-TÊTE de bloc de VALEURS.
Dans Visual Studio 2012 +/-, la page de propriétés pour les "Propriétés de Configuration'.L'éditeur de liens."Ligne de commande" contient une case à cocher intitulée "Options Supplémentaires". Si vous êtes à la construction x64, assurez-vous que la boîte ne contient pas /MACHINE:I386. Mes projets a fait et il a généré l'erreur en question.
Je suis tombé sur ce problème lors de la construction de l'intervalle QT. Les instructions que j'ai lu quelque part suggéré que je configurer nmake à l'aide de VS invite de commande.
J'ai choisi la version x64 invite de commande et effectué configurer sans trop de tracas. Quand j'ai essayé de nmake, il a donné à cette erreur.
Je pense que certains composants ont été pré-construit pour 32-bit. L'erreur même rapporté des modules qui ont été construits pour x86.
J'ai utilisé la version 32 bits par défaut VS invite de commande et ça a fonctionné.
Dans Visual Studio 2013,
1) Vérifier dans les Pages de propriétés du Projet /Propriétés de Configuration /Gestionnaire /Toutes les Options et de corriger toutes les miss configuré la machine et des répertoires.
2) Vérifier dans les Pages de propriétés du Projet /Propriétés de Configuration /Gestionnaire /d'Entrée et de corriger toutes les miss répertoires configurés.
Voir l'exemple 1)
Définir le 64 bits option de compilation
-m64 -cubin
L'indicateur est lors de la compilation du journal.
Comme ceci:
Que
"-machine 32"
est le problème.Premier set 64 bits option de compilation,
prochaine ré hybride mise en option de compilation.
Alors u peut voir le réussir.
Si votre solution a lib projets de vérification de la Machine Cible propriété dans Propriété->Bibliothécaire->Général
En plus de Jhonson de la liste, cochez aussi la bibliothèque dossiers
Dans visual studio, sélectionnez Outils > Options à partir du menu principal. sélectionner les Projets et les Solutions > Répertoires de VC++. Sélectionnez x64 à partir de la Plate-forme de liste déroulante.
Ce qui s'est passé pour moi aujourd'hui, parce que j'avais ajouté un répertoire de la bibliothèque tout en x86 mode, et accidentellement supprimé les hérité de répertoires, de les rendre codé en dur à la place.
Puis après le passage en x64, mes Répertoires de VC++ encore lire:
"...;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);"
au lieu de la _x64.
$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
J'ai été en utilisant CMake & ensuite ajouté un win32 configuration. La page de propriétés ont montré x86 mais en fait, lors de l'ouverture du fichier vcxproj dans un éditeur de texte, il a été x64! Modifier manuellement pour x86 réglé ce problème.
C'est très frustrant et ennuyeux problème, mais une fois que vous comprenez cela, c'est très simple: vous avez un élément quelconque vous êtes à la construction que de la construction d'une architecture de type (dans votre cas, x64) malgré le fait qu'il a été la cible d'un autre type (dire x86).
Vous pouvez disséquer la source de votre problème en regardant quel fichier obj est à l'origine de l'accident, et de commencer à chercher le problème. Chaque obj aura un code source analogique: soit en rpc, c, asm etc. Il peut y avoir des événements construire autour d'elle qui utilisent le mauvais outil. Vérifier que dans les feuilles de propriétés.
Je regarde en premier avant de passer à C Johnson liste de choses à faire.
vcxproj fichier peut contenir de la MACHINE:i386"
Edit vcxproj fichier avec l'éditeur. enlever !
J'ai résolu ce problème en changeant Win32 pour *64 dans Visual Studio 2013.
module type de machine est la machine sur laquelle vous êtes de la compilation et de la machine cible, c'est à l'architecture x86 ou x64 pour laquelle vous construisez votre binaires.
Ce problème peut également se produire si votre projet mis en place pour avoir les mêmes répertoires intermédiaires dans les Propriétés du Projet -> Propriétés de Configuration -> Général
Tout d'abord essayer les choses suivantes:
1. goto configuration Manager et créer un nouveau x64 si il n'y est pas déjà.
2. sélectionnez la version x64 de la solution.
3. allez à propriétés de projet et puis l'éditeur de liens->Avancé sélectionnez machine x64.
4. Maintenant reconstruire la solution.
Si vous êtes encore obtenir la même erreur. essayez de nettoyer la solution et ensuite de le reconstruire à nouveau et ouvrir visual studio, vous obtiendrez la liste des récentes projet ouvert , cliquez-droit sur le projet et l'enlever de là. Maintenant, allez à la solution, et de rouvrir la solution à nouveau.
ce qui m'arrive quand je convertir mon VS2008 solution pour VS2010 & changement win32 configuration pour les systèmes X64, dans mon ancienne solution que j'ai mfcs90d.lib (Configuration->Linker->Input->dépendances Supplémentaires), comme je suis en utilisant VS010 je viens de vérifier dans VS2010 dossier où il est mfcs100d.lib, donc j'ai changé mfcs90d.lib à mfcs100d.lib dans (Configuration->Linker->Input->dépendances Supplémentaires) il a bien fonctionné.
Pour ceux qui sont avec 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 trousse est réglé sur x86, comme illustré ci-dessous.
pour certains à l'aide de l'invite de commande (dos)
cela peut être utile:
Aussi, Si vous aimez cette:
CL "%1%2%3" /EHsc /lien user32.lib " Gdi32.lib Winmm.lib comctl32.lib *.obj /SUBSYSTEM:CONSOLE /MACHINE:x86
vous avez à del *.obj avant; pour éviter la confusion de l'éditeur de liens à la fois avec 64 et 32 bits des objets laissés par avant compilations?
ce qui est de l'OS? si c'est un windows x64, alors vous devez vous assurer que CUDA x64 a été installé et, donc, que VS2008 devrait compiler le projet en x64 mode...
CUDA ne installer x64 OU x86 de windows