Donc, je codais quelque chose sur 32 bits et hier, je devais construire une dll et cela me posait quelques problèmes. En tout cas je les ai résolus ici .
Malheureusement, même si je pensais que tout fonctionnait bien après tout, ce n’était pas le cas lorsque j’ai déplacé mon programme et mon fichier Make sur un autre ordinateur fonctionnant en 64 bits, comme vous pouvez le deviner ...
Donc, mon problème est lié à la délocalisation à cause de 64 bits
/usr/bin/ld: MyClass.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
MyClass.o: could not read symbols: Bad value
et voici mon makefile
MyProgram: main.o chkopts
-${CLINKER} -o $@ $< ${MYLIB} ${PETSC_MAT_LIB}
${RM} main.o
export LD_LIBRARY_PATH=${LIBADD}:$LD_LIBRARY_PATH
LibMyProgram.so: MyClass.o chkopts
-${CLINKER} -shared -Wl,-soname,${SONAME} -o ${VERS} *.o ${PETSC_MAT_LIB}
mv ${VERS} ${LIBADD}
ln -sf ${LIBADD}${VERS} ${LIBADD}${SOWOV}
ln -sf ${LIBADD}${VERS} ${LIBADD}${SONAME}
J'ai essayé d'ajouter -fPIC dans CFLAGS, CPPFLAGS et même LDFLAGS. J'ai également essayé d'ajouter -fPIC avant et après le drapeau partagé.
-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS} *.o ${PETSC_MAT_LIB}
Mais je vais juste avoir une même erreur que précédemment.
Si j'utilise CFLAGS = -fPIC, j'obtiendrai le même type d'erreur, à savoir:
.../petsc/petsc-3.2-p6/Arch-linux2-cxx-debug/lib/libpetsc.a(err.o): relocation R_X86_64_32 against `ompi_mpi_comm_self' can not be used when making a shared object; recompile with -fPIC.
J'ai lu sur tous les sujets qui sont même similaires à mon problème mais je n'ai pas pu comprendre.
La solution consistait à tout compiler avec -fPIC
et à lier les objets partagés à -shared
.
Ajoutez -fPIC
à CFLAGS
ou CXXFLAGS
pour les projets basés sur la marque.
J'ai rencontré le même problème lorsque j'essaie de créer une bibliothèque partagée qui doit lier une bibliothèque statique.
J'ai résolu le problème en ajoutant -fPIC à CXXFLAGS pour compiler les fichiers .o archivés dans la bibliothèque statique.
En essayant de compiler xmlrpc-c-1.06.41 dans CentOS 6.5, j’ai rencontré le même problème de liaison, qui a été résolu par le texte suivant:
CXXFLAGS = $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC
Vous trouverez plus d’informations sur les drapeaux link
Je rencontre aussi ce problème… .. Comme j'essaie d'utiliser @Mare et @ user2391685, cela peut bien fonctionner:
Utilisation de -fPIC
lorsque vous créez un fichier .o
: Par exemple:
gcc -Wall -fPIC -c hello.c -I./ -I/usr/lib/jvm/Java/include/ -I/usr/lib/jvm/Java/include/linux/
Ensuite, vous pouvez construire un fichier .so
:
gcc -Wall -rdynamic -shared -o libhello.so hello.o Main.h -I/usr/lib/jvm/Java/include/ -I/usr/lib/jvm/Java/include/linux/
Si ce problème persiste après l'ajout de "-fPIC", essayez de nettoyer tous les fichiers .o et réexécutez