Après des heures de recherches sur Google, je décide d'abandonner et de demander à des experts. J'essaie 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. La dernière étape consiste à relier tous les objets et bibliothèques pour X Windows à cet exécutable --- xgap. D'une certaine manière, il 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 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 ld drapeaux dans ma commande gcc comme indiqué ci-dessus: - melf_i386 et - ofmat 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 déterminé?
Merci pour toute idée et aide!
EDIT: quand j’ajoute l’indicateur -m32 dans ma dernière commande gcc (l’étape de liaison, je crois), même si j’ai le drapeau -L/usr/lib32 en place, gcc ne recherche plus dans/usr/lib32 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=47479 pour télécharger tous les .a archives nécessaires pour la liaison. Alors gcc a fonctionné. Je pense que gcc a cherché dans le répertoire /usr/lib32 mais n'a pas t ne trouve pas les archives . a , puis est allé chercher dans le répertoire standard qui est /usr/lib , où se trouvent les fichiers incompatibles *. so .
Mais alors la question est: les fichiers *. So dans /usr/lib32/ du paquet ia32-libs ne possède pas vraiment les bibliothèques nécessaires pour lier? A quoi servent ces fichiers /usr/lib32/?
LDFLAGS
devrait également inclure -m32
. Suivre devrait fonctionner:
export LDFLAGS='-m32 -L/usr/lib32'
En fait, vous pouvez supprimer la partie -L/usr/lib32
, 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 un ordinateur 64 bits est le suivant:
export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make
..ou alimentez ces variables pour configurer le script si vous utilisez autotools.
METTRE À JOUR:
On dirait que vous n'êtes pas vraiment au courant des différences entre les liens avec les bibliothèques statiques et dynamiques. Je vais essayer d'être aussi minime que possible:
.a
libname.a
pour dynamic et libname_s.a
pour la version statique..so
qui devrait être présente sur 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 ().
Je recevais des erreurs telles que:
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++
Cela a résolu le problème pour moi:
Sudo apt-get install g++-multilib
si vous utilisez un package gcc différent de celui par défaut (par exemple, gcc-7
), vous devez l'installer pour cette version spécifique:
Sudo apt-get install g++-7-multilib