Après des heures de recherche sur Google, je décide d'abandonner et de vous demander des experts. J'essaye de construire une application 32 bits (xgap si quelqu'un est intéressé) dans mon 64 Ubuntu 11.10. J'ai ajouté le CFLAGS = -m32 et le LDFLAGS = -L / usr / lib32 dans le makefile. Les objets sont intégrés en 32 bits fin. La dernière étape consiste à lier tous les objets et bibliothèques pour X windows dans cet exécutable --- xgap. D'une manière ou d'une autre, cela continue de me donner cette erreur:
gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11 -lSM -lICE
/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...
/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...
J'ai installé ia32-libs et le support mutilib . Je pense que j'ai juste besoin de forcer l'éditeur de liens pour générer une sortie i386. J'ai essayé de mettre deux drapeaux LD dans ma commande gcc comme indiqué ci-dessus: -melf_i386 et -oformat elf32-i386 . Mais ce qui se passe, c'est que gcc ne recherche plus la bibliothèque 32 bits dans / usr / lib32 . Je me demande si je dois mettre ces drapeaux dans un ordre fixe?
Merci pour toute idée et aide!
EDIT: lorsque j'ajoute l'indicateur -m32 dans ma dernière commande gcc (l'étape de liaison je crois), même si j'ai l'indicateur -L / usr / lib32 en place, gcc ne recherche plus dans / usr / lib32 (vraiment bizarre ...) et génère l'erreur suivante:
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status
Quelqu'un a une idée pourquoi cela se produit? J'utilise l'outil automatique pour configurer et créer. Je suis vraiment bon pour modifier ces fichiers de script.
EIDT : J'ai résolu le problème. Je pense que gcc attendait une archive de bibliothèque statique. J'ai utilisé le script getlibs de http://ubuntuforums.org/showthread.php?t=474790 pour télécharger toutes les archives .a nécessaires pour la liaison. Ensuite, gcc a fonctionné. Je pense que gcc a fait une recherche dans le répertoire / usr / lib32 mais n'a pas trouvé les archives .a alors a continué à chercher dans le répertoire standard qui est / usr / lib , où il trouve les fichiers * .so incompatibles .
Mais alors la question est: les fichiers * .so dans / usr / lib32 / du paquet ia32-libs n'ont pas vraiment les bibliothèques nécessaires pour la liaison? À quoi servent ces fichiers dans / usr / lib32 / ?
Réponses:
LDFLAGS
devrait également inclure-m32
. Ce qui suit devrait fonctionner:En fait, vous pouvez supprimer une
-L/usr/lib32
partie, car il s'agit d'un répertoire par défaut pour les bibliothèques 32 bits, et votre système en est conscient.Fondamentalement, le moyen le plus simple de créer une application 32 bits sur une machine 64 bits est:
..ou alimentez ces variables pour configurer le script si vous utilisez des outils automatiques.
MISE À JOUR:
Il semble que vous ne connaissiez pas vraiment les différences de liaison avec les bibliothèques statiques et dynamiques. Je vais essayer d'être le moins possible:
.a
libname.a
pour la version dynamique etlibname_s.a
statique..so
bibliothèque d'exécution qui devrait être présente dans votre système.Veuillez noter que nous ne parlons pas ici d'astuces avancées, comme le chargement explicite de DSO à l'aide de l'API dlopen () / dlsym ().
la source
-l/usr/lib32/libXaw.so
place?J'obtenais des erreurs telles que:
Cela m'a corrigé:
si vous utilisez un package gcc autre que celui par défaut (par exemple
gcc-7
), vous devrez installer le package pour cette version spécifique:la source
g++-multilib
est pour g ++ (C ++), pour gcc (C) vous avez également besoingcc-multilib
.