J'essaie de lier une bibliothèque statique à une bibliothèque partagée, je reçois l'erreur suivante
/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(fileappender.o): la relocalisation R_X86_64_32S contre "un symbole local" ne peut pas être utilisée lors de la création d'un partage objet; recompiler avec -fPIC ../../../ libraries/log4cplus/liblog4cplus.a: impossible de lire les symboles: valeur incorrecte collect2: ld a renvoyé 1 état de sortie
Mais cela a fonctionné sur une machine 32 bits sans une telle erreur. J'ai essayé d'ajouter The -fPIC
signale manuellement dans le Makefile que cela n'a pas résolu le problème
J'ai essayé le -whole-archive
drapeau comme suggéré ici mais sans succès.
/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): relocalisation R_X86_64_32S contre `vtable pour log4cplus :: spi :: AppenderAttachable 'ne peut pas être utilisé lors de la création d'un objet partagé; recompiler avec -fPIC ../../../ libraries/log4cplus/liblog4cplus.a (appenderattachableimpl.o): impossible de lire les symboles: valeur incorrecte collect2: ld renvoyé 1 état de sortie
unzip log4cplus-1.1.0.Zip
./configure --enable-static=yes --enable-threads=yes
vi Makefile
et ajout de -fPIC à CXXFLAGS et CFLAGSmake
g++ -frtti -w -c -fPIC -I"Include_Directory" myfile.cpp
g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl
En supposant que vous générez une bibliothèque partagée, il est probable que la variante de liblog4cplus.a
que vous utilisez n'a pas été compilé avec -fPIC
. Sous Linux, vous pouvez le confirmer en extrayant les fichiers objets de la bibliothèque statique et en vérifiant leurs déplacements :
ar -x liblog4cplus.a
readelf --relocs fileappender.o | egrep '(GOT|PLT|JU?MP_SLOT)'
Si la sortie est vide, la bibliothèque statique n'est pas indépendante de la position et ne peut pas être utilisée pour générer un objet partagé.
Comme la bibliothèque statique contient du code objet déjà compilé, fournir l'indicateur -fPIC ne vous aidera pas.
Vous devez vous procurer une version de liblog4cplus.a
compilé avec -fPIC
et utilisez celui-là à la place.
J'ai une erreur similaire lors de l'installation de FCL qui nécessite CCD lib (libccd) comme ceci:
/ usr/bin/ld: /usr/local/lib/libccd.a(ccd.o): relocalisation R_X86_64_32S contre `un symbole local 'ne peut pas être utilisée lors de la création d'un objet partagé; recompiler avec -fPIC
Je trouve qu'il y a deux fichiers différents nommés "libccd.a":
J'ai résolu le problème en supprimant le premier fichier.
La relocalisation R_X86_64_PC32 par rapport au symbole non défini se produit généralement lorsque LDFLAGS est défini avec le renforcement et CFLAGS pas.
Peut-être juste une erreur de l'utilisateur:
Si vous utilisez -specs =/usr/lib/rpm/redhat/redhat-hardened-ld au moment du lien, vous devez également utiliser -specs =/usr/lib/rpm/redhat/redhat-hardened -cc1 au moment de la compilation, et comme vous compilez et liez en même temps, vous avez besoin des deux, ou supprimez -specs =/usr/lib/rpm/redhat/redhat-hardened-ld. Corrections communes:
https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c
https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch