2017-06-10 1 views
0

J'essaie de compiler un programme C++ et j'ai quelques problèmes. En particulier, quand j'utilise x86_64-w64-mingw32-gcc comme compilateur, il se plaint à mi-chemin de ma compilation en disant "tmp/src/libfastms/solver/solver.cpp.o: fichier non reconnu: format de fichier non reconnu".MinGW compilation "fichier non reconnu: format de fichier non reconnu"

Voici mon makefile (pas le mien, je suis en train d'adapter ce makefile à un environnement Cygwin) https://pastebin.com/vgnVYJUL

est ici la sortie de la console quand je lance make:

x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/solver/solver.cpp.o src/libfastms/solver/solver.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/solver/solver_base.cpp.o src/libfastms/solver/solver_base.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/solver/solver_host.cpp.o src/libfastms/solver/solver_host.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/util/has_cuda.cpp.o src/libfastms/util/has_cuda.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/util/image_mat.cpp.o src/libfastms/util/image_mat.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
ld -r -o tmp/src/libfastms/libfastms.o tmp/src/libfastms/solver/solver.cpp.o tmp/src/libfastms/solver/solver_base.cpp.o tmp/src/libfastms/solver/solver_host.cpp.o tmp/src/libfastms/util/has_cuda.cpp.o tmp/src/libfastms/util/image_mat.cpp.o 
tmp/src/libfastms/solver/solver.cpp.o: file not recognized: File format not recognized 
Makefile:167: recipe for target 'tmp/src/libfastms/libfastms.o' failed 
make: *** [tmp/src/libfastms/libfastms.o] Error 1 

D'autres notes :

  • Je n'ai pas ce problème quand je compile avec g ++ (semble seulement être MinGW)
  • Une solution commune à ce problème est de nettoyer le répertoire des fichiers d'objets résiduels. Cela ne fonctionne pas.
  • Une autre raison courante est d'essayer de compiler des fichiers .h. Évidemment, je ne fais pas ça.

Merci d'avance.

+0

Je ne suis pas familier avec la construction sur Windows, mais je soupçonne que votre problème est que l'éditeur de liens essaie de lier un programme 32 bits, et vous lui donnez des fichiers objets 64 bits. Pourquoi utilisez-vous 'ld' directement pour lier votre programme? Pourquoi n'utilisez-vous pas 'x86_65-w64-mingw32-gcc' en tant que frontal pour l'éditeur de liens? C'est la manière traditionnelle de lier les choses et cela fonctionne presque toujours mieux puisque le frontal du compilateur sait quelles options supplémentaires spéciales doivent être apportées à l'éditeur de liens. Est-ce que l'option '-shared' fonctionne sur minGW? Si vous devez utiliser 'ld', vous aurez probablement besoin de savoir comment lui dire d'utiliser des objets 64 bits. – MadScientist

+0

Salut. Merci pour la réponse. Comme je l'ai mentionné, je modifie le makefile de quelqu'un d'autre afin de compiler ce programme pour Windows.Au lieu d'utiliser ld comment pourrais-je aborder le problème? Est-ce que j'appellerais simplement x86_65-w64-mingw32-gcc -o ? Aussi, excusez mon manque d'expérience, d'après ce que je comprends, x86_65-w64-mingw32-gcc est un compilateur 64 bits alors pourquoi essayerait-il de lier un programme 32 bits? –

+0

Les compilateurs 64 bits peuvent généralement générer du code 32 bits et 64 bits. Intel 32 bits est essentiellement un sous-ensemble de 64 bits. Pour quelque raison que ce soit, Windows a toujours été utilisé par les compilateurs pour générer du code 32 bits par défaut, sauf indication contraire. Ainsi, une commande 'ld' brute attendra de générer 32 bits. Quant à votre autre question, Mike Kinghan a fourni des détails dans sa réponse. – MadScientist

Répondre

1

Vous compilez vos fichiers objet avec un pilote de compilateur 64 bits, w64-mingw32-gcc, et -m64 vous il expressément une pour générer du code 64 bits (inutilement, car c'est sa valeur par défaut). Mais vous liez avec un éditeur de liens 32 bits qui ne comprend pas les fichiers objet 64 bits.

Ce qui se passe parce que dans votre makefile vous êtes, exceptionnellement, invoquant ld explicitement votre lien solver supplémentaire:

COMMAND_LINK_SOLVER=ld -r -o [email protected] $^ 

plutôt que de déléguer la liaison à votre pilote du compilateur de la manière habituelle, et un 32 -bit ld d'un autre toolchain se trouve dans votre PATH avant le 64-bit celui appartenant à votre toolchain mingw-w64.

Pour éviter cela, invoquer l'éditeur de liens via le pilote du compilateur comme normal, ce qui pour votre solver moyens de liaison:

COMMAND_LINK_SOLVER=$(GXX) -Wl,-r -o [email protected] $^ 

Vous pouvez compter sur w64-mingw32-gcc d'invoquer la ld qui a été installé avec elle.

Il n'est pas nécessaire de corriger votre lien main car il est déjà fait dans le bon sens.

+0

Wow! Merci beaucoup. Il semble maintenant franchir cette étape. Cependant, il semble que le lien principal se plaint. x86_64-w64-mingw32-gcc -o principal tmp/src/examples/exemple_batchprocessing.cpp.o tmp/src/exemples/exemple_gui.cpp.o tmp/src/exemples/main.cpp.o tmp/src/libfastms /libfastms.o tmp/src/libfastms/libfastms.o: Dans la fonction 'WinMainCRTStartup ': /usr/src/debug/mingw64-x86_64-runtime-5.0.2-1/crt/crtexe.c:171: multiple définition de 'WinMainCRTStartup '. Après avoir recherché cette erreur, il semble que beaucoup de gens ont cette erreur quand ils n'ajoutent pas l'option -c pour compiler les fichiers .cpp. Pas le cas ici –

+0

@AlexKyriazis Bienvenue sur Stackoverflow. S'il vous plaît voir [Que dois-je faire quand quelqu'un répond à ma question?] (Https://stackoverflow.com/help/someone-answers). Si vous avez un autre problème que vous ne pouvez pas résoudre vous-même, vous pouvez poser une nouvelle question à . –