2010-07-05 5 views
4

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.

Répondre

2

Essayez

gcc -Wall -fPIC -O3 -shared -o meinzeug.so /usr/lib/libgsl.a -lm meinzeug. 

que vous ne pouvez pas faire

gcc -Wall -fPIC -O3 -shared -static ... # shared and static at the same time ? 

vous fournir ainsi la bibliothèque statique de GSL aux côtés de votre code.

À la fin de la journée, je voudrais punt et garder la dépendance sur le GSL. À peu près tout le monde l'a, et l'API est plutôt stable.

+0

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

+0

Juste en vérifiant ici: vous avez un fichier /usr/lib/libgsl.a? –

+0

Oui, même copié dans le dossier du programme dans l'espoir que cela pourrait aider. – Wrzlprmft

0

La commande des appels de bibliothèque est importante. Pour moi, cela signifiait envoyer le fichier /usr/lib/libgsl.a à la fin de la commande. Cela l'a résolu.

Questions connexes