web-dev-qa-db-fra.com

Lier une bibliothèque partagée avec une autre bibliothèque partagée sous Linux

J'essaye de construire une bibliothèque partagée. Disons libabc.so. Il utilise un autre fichier .so, disons lib123.so (une lib dans/usr/local/lib). Maintenant, j'utilise ma lib partagée libabc.so dans mon application. dis my-app.Je veux savoir comment lier ces binaires ?? je ne veux pas lier my-app avec lib123.so directement. my-app doit être lié uniquement à libabc.so. Comment puis-je faire ceci?

Merci d'avance. J'utilise le compilateur g ++

18
A R

Supposer que libabc.so est obtenu à partir de indépendant de la position fichiers de code objet abc1.pic.o et abc2.pic.o; alors vous les avez construits avec par exemple.

 gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
 gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o

et vous construisez libabc.so avec

gcc -shared  abc1.pic.o  abc2.pic.o -L/usr/local/lib -l123 -o libabc.so

J'ai ajouté -L/usr/local/lib avant -l123 parce que je suppose que vous avez un /usr/local/lib/lib123.so bibliothèque partagée.

Lisez également le HowTo de la bibliothèque de programmes .

Comme vous le voyez, vous pouvez lier une bibliothèque partagée lib123.so dans votre propre bibliothèque partagée libabc.so

Vérifiez ensuite avec ldd libabc.so

PS. N'utilisez pas de bibliothèque statique pour lib123.a (ce devrait être PIC). Si vous liez du code non PIC à un objet partagé, vous perdez la plupart des avantages des objets partagés et l'éditeur de liens dynamique ld.so doit effectuer des millions de délocalisations.

23

En essayant de créer ma propre bibliothèque partagée qui utilise Berkeley DB, j'ai constaté que je devais mettre le -ldb à la fin de la commande gcc ou bien il a explosé en disant que le symbole 'db_create' n'a pas été trouvé. C'était sous Cygwin.

Plus précisément, cela a fonctionné:

gcc -shared -o $ b/$ libfile nt _ *. o -ldb

Cela n'a pas fonctionné:

gcc -ldb -shared -o $ b/$ libfile nt _ *. o

1
user2126571

En suivant la même procédure indiquée par Basile Starynkevitch , par exemple, j'ai une bibliothèque qui dépend de libm.so, donc la compilation des objets de bibliothèque est:

gcc -fPIC -Wall -g -I include -I src -c src/wavegen.c  -o build/arm/wavegen.o                                                                                          
gcc -fPIC -Wall -g -I include -I src -c src/serial.c  -o build/arm/serial.o

Pour compiler la bibliothèque, cependant, dans certaines versions de gcc, l'ordre dans lequel les références de bibliothèque sont placées est important, donc je suggère, pour assurer la compatibilité, en plaçant ces références à la fin de la commande:

gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm

J'ai testé sur PC (gcc v.8.3.0) et dans ARM (gcc v.4.6.3).