web-dev-qa-db-fra.com

Comment résoudre les conflits de type de machine du module «X86» avec le type de machine cible «x64» Visual Studio

Je compile la bibliothèque Openssl que je dois utiliser dans le script python. J'utilise l'invite de commande du développeur Visual Studio 2015. Ma machine est Windows 7 64 bits.

Lorsque je tape la commande: nmake -f ms\ntdll.mak

Je reçois cette erreur:

tmp32dll\uplink.obj : fatal error LNK1112: module machine type 'X86' conflicts w
ith target machine type 'x64'
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0
\VC\BIN\AMD64_arm\link.EXE"' : return code '0x458'
Stop.

J'ai cherché et plusieurs solutions pour un problème similaire suggèrent de changer la plate-forme du projet à partir des paramètres du projet. Je n'ai pas de projet VS. J'exécute toutes ces commandes juste pour compiler la bibliothèque OpenSSL. J'utilise la commande VS.

19
user2192774

Je suis tombé sur le même problème - juste avec VS2013.

Il y a 2 approches que j'ai rencontrées qui peuvent ou non être utiles dans votre cas:

LA PREMIÈRE APPROCHE

(Peut être pertinent uniquement pour les versions VS2013 et supérieures)

Ouvrez l'invite de commande des outils natifs VS2015 x64 et exécutez-y la commande.

 Note:
 If you get the opposite message:
 module machine type 'x64' conflicts with target machine type 'x86' 
 then you should open the 'VS2015 x86 Native Tools Command Prompt' 

Les deux outils se trouvent dans le dossier:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\Shortcuts

LA DEUXIÈME APPROCHE

(Peut être pertinent uniquement pour les versions antérieures à VS2013)

Dans l'invite de commande du développeur pour VS2015, vous pouvez modifier la plate-forme cible du compilateur en exécutant la commande suivante

"C:\Program Files (x86)\Microsoft Visual Studio 15.0\VC\vcvarsall.bat x64"

"C:\Program Files (x86)\Microsoft Visual Studio [Version VS]\VC\vcvarsall.bat [Plate-forme cible]"

Pour VS 2017

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat [Plate-forme cible]"

Note:
VS Version: 10.0|11.0|12.0|15.0|... 
Target Platform: x86|AMD64|x64|arm|x86_arm|x86_AMD64|AMD64_x86|AMD64_arm|AMD64_x86
*leaving the target platform empty will default to x86
22
Merav Kochavi

Cette erreur signifie que tmp32dll\uplink.obj est un binaire 32 bits alors que l'éditeur de liens s'attendait à ce qu'il soit 64 bits car il cible 64 bits.

On dirait que vous devez le recompiler en 64 bits, ou simplement effectuer une reconstruction-tout (ou supprimer tout *.obj ou même tout le répertoire de sortie binaire)

Cela peut se produire si le processus de génération est interrompu, puis vous modifiez la plate-forme cible, puis vous répétez le processus de génération de manière incrémentielle. 32 bits ne se mélangent pas avec 64 bits, c'est donc complètement dans un sens ou dans l'autre.

6
V-R

Cette erreur se produit car un composant spécifique de la génération est compilé en tant que binaire x86 au lieu de x64 (l'architecture de la machine cible) - en gros, vous donnez à l'éditeur de liens une pièce de puzzle carrée et lui dites de s'insérer dans un trou circulaire.

Dans ton cas:

tmp32dll\uplink.obj : fatal error LNK1112: module machine type 'X86' conflicts w
ith target machine type 'x64'
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0
\VC\BIN\AMD64_arm\link.EXE"' : return code '0x458'
Stop.

Vous regardez le nom du fichier obj qui provoque l'erreur: uplink.obj, vous regardez donc uplink.cpp (ou uplink.asm ou uplink.wimporte) et inspectez la façon dont il est compilé. Habituellement, tout cela est automatisé dans VS mais parfois il y a des étapes de construction spéciales qui ont été ajoutées par le développeur. Inspectez les événements personnalisés avant et après la construction pour voir si un outil x86 est utilisé pour l'assembler.

Dans mon cas, j'essayais de compiler 7Zip en x64 en utilisant Visual Studio 8 et tout se compilait sauf les macros d'assemblage (asm), qui se compilaient en x86 et interrompaient le processus de construction. J'ai trouvé que VS essayait d'utiliser ml.exe pour les compiler au lieu de ml64.exe en regardant la feuille de propriétés de l'asm. Dans mon cas, j'ai changé l'appel à ml64.exe pour me débarrasser de cette erreur (j'ai également dû modifier les fichiers asm en 64 bits uniquement en supprimant tout le code x86, mais c'est une autre histoire).

1
thebunnyrules