Croix de la compilation C++ du projet, les Délocalisations dans le générique ELF (EM: 3)
J'ai travaillé sur un projet c++ pour un certain temps maintenant, mais j'aimerais la porter sur mon processeur arm. J'ai déjà tous mes de la croix-outils de compilation (je suis en utilisant CodeSourcery) et pensé que je pourrais juste changer mon makefile de dire que le compilateur. Il compile fine à l'aide de la valeur par défaut g++, mais Lorsque vous essayez une pointant vers le cross-compilateur-je obtenir la réinstallation des erreurs:
/home/oryan/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.2/../../../../arm-none-linux-gnueabi/bin/ld: ServerSocket.o: les Délocalisations dans le générique ELF (EM: 3)
ServerSocket.o: impossible de lire les symboles: Fichier en format incorrect
collect2: ld a retourné 1 code de sortie
make: *** [simple_server] Erreur 1
Il semble que je n'ai pas de lien mis en place ou il pointe vers un emplacement incorrect. Je ne suis pas familier avec les makefiles et je suis probablement manquer quelque chose d'évident. Le makefile que j'ai utilisé est de http://tldp.org/LDP/LG/issue74/tougher.html avec le côté client supprimée:
# Makefile for the socket programming example
#
simple_server_objects = ServerSocket.o Socket.o simple_server_main.o
all : simple_server
simple_server: $(simple_server_objects)
/home/matt/CodeSourcery/bin/arm-none-linux-gnueabi-g++ -o simple_server $(simple_server_objects)
Socket: Socket.cpp
ServerSocket: ServerSocket.cpp
simple_server_main: simple_server_main.cpp
clean:
rm -f *.o simple_server
Maintenant je suis à compiler manuellement chaque fichier et il fonctionne très bien, mais j'aimerais approfondir ma compréhension.
Merci!
OriginalL'auteur Matt | 2011-11-17
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous avez configuré votre makefile lien avec la nouvelle g++, mais vous n'avez pas changé le compilateur que vous utilisez pour construire les objets en premier lieu.
La façon la plus simple de résoudre ce problème est de définir l'environnement
CXX
à la prochaine compilateur, c'est à direou tout simplement pour une
make
en ajoutantCXX=...
à la ligne de commande.Vous aurez besoin de
make clean
en premier, mais vous pourrez ensuite utiliser le bon compilateur pour le compiler et lier.Vous pouvez aussi spécifier une nouvelle façon de compilation C++ fichiers règle dans votre makefile pour spécifier le nouveau compilateur, mais la variable d'environnement est plus facile:
Hmm. Je me rappelle que c'est
g++ -print-prog-name=ld
pour vous montrer qui c'est à l'aide, mais je ne me souviens pas comment indiquer un. Je pense qu'il pourrait en prendre un dans le même répertoire que cc1plus - avez-vous un ta en que dir (probablement CodeSourcery/libexec/gcc/arm-none-linux-gnueabi/4.5.2/)? Vous avez certainement eu l'binutils installé pour votre cross compilateur?g++ -print-prog-nom donne-moi juste "ld". Pas de ld fichier avec cc1plus. Dans CodeSourcery/bin/ il y a un arm-none-linux-gnueabi-ld. Peut-être un softlink arm-none-linux-gnueabi-ld?
softlinking à elle a fait un travail, mais je ne pense pas que c'est une bonne solution. Traversez maintenant la compilation se déroule sans accroc, mais pour compiler régulièrement de l'ancien g++ j'ai besoin de tuer le softlinks. Pour gagner l'un des maux de tête j'ai fait un autre...
Désolé, je n'ai pas oublié à ce sujet - j'aimerais connaître la bonne façon de choisir les ld vous voulez de moi, mais je ne connais pas la réponse. Je vais voir si je peut le découvrir dans les prochains jours.
OriginalL'auteur Rup
Le problème est à cause de ces trois règles:
Tout d'abord, la partie gauche de la règle doit être l'objet du fichier, je suppose, de sorte que devrait avoir le
.o
suffixe.Le deuxième problème, et vraisemblablement à l'origine de votre problème, c'est qu'il n'y a pas de commande pour compiler les fichiers sources, ce qui signifie que
make
va utiliser le compilateur par défaut et de ne pas le cross-compilateur.OriginalL'auteur Some programmer dude