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).