GNU/Linux >> Tutoriels Linux >  >> Linux

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

Lorsque j'ai essayé 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, sinon il a explosé en disant que le symbole 'db_create' n'était pas 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


Supposons que libabc.so est obtenu à partir de fichiers de code objet indépendants de la position 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

Lisez également le Guide pratique 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

Vous voudrez peut-être configurer un rpath dans votre libabc.so en ajoutant -Wl,-rpath et -Wl,$RPATHDIR à la commande de liaison.

Pour plus de détails, lisez l'article de Drepper Comment écrire des bibliothèques partagées

PS. N'utilisez pas de bibliothèque statique pour lib123.a (il devrait être PIC). Si vous liez du code non-PIC dans 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éplacements.


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 pour les objets de la 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, je suggère donc, pour assurer la compatibilité, de placer 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 sur ARM (gcc v.4.6.3).


Linux
  1. Commande JQ sous Linux avec exemples

  2. Introduction aux bibliothèques partagées Linux (comment créer des bibliothèques partagées)

  3. Bibliothèque partagée dynamique C++ sous Linux

  4. Compilation dynamique de la bibliothèque partagée avec g++

  5. Lien statique de la fonction de bibliothèque partagée dans gcc

Installer Linux avec LVM

Remplacer du par de la poussière sous Linux

Commande Linux wc avec exemples

Commande Linux ip avec exemples

15 Commande Linux ps avec exemples

Comment faire un délai de bibliothèque partagée chargé sur Linux