comment lier une bibliothèque statique à une bibliothèque dynamique dans gcc
Sous gcc (g++), j'ai compilé une bibliothèque statique .a
(appelez-la some_static_lib.a
). Je veux lier (est-ce la bonne phrase?) ce fichier .a
dans une autre bibliothèque dynamique (appelez-le libsomeDyn.so
) que je construis. Bien que le .so
compile, Je ne vois pas le contenu de .a
sous .so
en utilisant la commande nm
:
/usr/bin/g++ -fPIC-g -O2 -Wall-Werror -pipe -mars=pentium3 - mtune=prescott-MD-D_FILE_OFFSET_BITS = 64-DLINUX-D_GNU_SOURCE-D_thread_safe-I../../../../../../../../ -I../../../../../../../..// libraries-WL, - rpath, / usr / lib-o libsomeDyn.so certains.o un autre.o some_static_lib.a-partagé -Wl -x - Wl, - soname, libsomeDyn.so
, je ne vois pas les fonctions de sous some_static_lib.a
sous libsomeDyn.so
. Ce que je fais mal?
2 réponses
Les bibliothèques statiques ont des règles spéciales en matière de liaison. Un objet de la bibliothèque statique ne sera ajouté au binaire que si l'objet fournit un symbole non résolu.
Sous Linux, vous pouvez modifier ce comportement avec l'option --whole-archive
linker:
g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive
Pour tous ceux qui rencontrent ce problème comme moi (et n'ont pas compris la réponse correctement): voici un court howto generate a dynamic library (libmylib.so) d'un statique (mylib.a):
1.) créer un mylib.fichier c qui importe uniquement le mylib.h fichier
2.) compilez ce mylib.c à mylib.o avec
gcc -c -fPIC mylib.c -o msat.o
3.) générer une bibliothèque dynamique avec la commande suivante:
gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a
Cela a fonctionné au moins pour moi, en transformant une bibliothèque statique (compilée avec-fPIC) en un bibliothèque dynamique. Je ne suis pas sûr que cela fonctionnera pour d'autres bibliothèques.