Remarque: Malgré la mention de Python dans ce qui suit, il y a de fortes chances pour que mon problème ne soit pas du tout lié à Python. Si je ne me trompe pas le "module" que je mentionne est équivalent à une bibliothèque C, au moins pour les préoccupations de mon problème.Liaison statique de GSL (ou d'une autre bibliothèque) dans une bibliothèque partagée
Sur Debian, j'essaye de créer un module Python avec C, qui à son tour utilise le GSL. Le Makefile suivant compile avec succès:
CC = gcc -Wall -fPIC -O3
NAME = meinzeug
matrizenwuerfler: $(SRC)
$(CC) -o $(NAME).o -I/usr/lib/python2.5/site-packages/numpy/core/include -I/usr/include/python2.5 -c $(NAME).c
$(CC) -shared -o $(NAME).so -lgsl -lgslcblas -lm $(NAME).o
Parce que ce module est censé être utilisé par des machines (Linux) autres que le mien, je veux que le GSL à inclure dans le module (ou être livré avec).
Cependant, si j'ajoute -static
en option à la dernière ligne du Makefile, je reçois l'erreur suivante:
gcc -Wall -fPIC -O3 -shared -static -o meinzeug.so -lgsl -lgslcblas -lm meinzeug.o
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.3.2/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.3.2/crtbeginT.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
Ajout -Wl,-Bstatic
avant que la bibliothèque reliant les résultats dans une autre erreur:
gcc -Wall -fPIC -O3 -shared -o meinzeug.so -Wl,-Bstatic -lgsl -lgslcblas -lm meinzeug.o
/usr/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
Autre substance, qui n'a pas fonctionné: Recompilation de GSL avec fPIC, -static-libgcc, permutation des options. Ce que je n'ai pas encore essayé est de compiler gcc avec fPIC ou similaire.
La première suggestion ne fonctionne pas - le programme se termine par symbole non défini: gsl_rng_taus qui est le même que si je n'avais pas lié du tout GSL. Ce que je ne comprends pas, c'est pourquoi '-static' et' -shared' sont contradictoires. Dans ma compréhension '-static' évite, que d'autres bibliothèques sont liées dynamiquement dans ma bibliothèque, alors que' -shared' permet à ma bibliothèque d'être liée dynamiquement à son tour. Dans le cas où je compte sur GSL disponible sur d'autres systèmes, est-ce qu'il pourrait y avoir des incompatibilités de version ou d'emplacement? – Wrzlprmft
Juste en vérifiant ici: vous avez un fichier /usr/lib/libgsl.a? –
Oui, même copié dans le dossier du programme dans l'espoir que cela pourrait aider. – Wrzlprmft