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?

29
gcc
demandé sur bob 2010-04-16 03:47:06

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
35
répondu R Samuel Klatchko 2017-01-18 17:00:23

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.

15
répondu Andreas Morgenstern 2017-11-07 11:35:00