web-dev-qa-db-fra.com

Convertir une bibliothèque statique en une bibliothèque partagée?

J'ai une bibliothèque tierce qui se compose principalement d'un grand nombre de fichiers de bibliothèque statiques (.a). Je peux le compiler dans un seul fichier de bibliothèque .a, Mais j'ai vraiment besoin que ce soit un seul fichier de bibliothèque partagée .so.

Existe-t-il un moyen de convertir un fichier .a Statique en un fichier .so Partagé? Ou plus généralement, existe-t-il un bon moyen de combiner un grand nombre de fichiers statiques .a Avec quelques fichiers objet .o En un seul fichier .so?

50
Eli Courtwright

Est-ce que cela (avec les -L appropriés bien sûr)

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib

Tu ne le fais pas?

40
dicroce

Vous ne pouvez pas faire cela si les objets de la bibliothèque statique ont été compilés sans -fPIC ou similaire.

23
vitaly.v.ch
g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-archive -la_static_lib -lb_static_lib -Wl,--no-whole-archive -lc_static_lib -lother_shared_object

Je ne suis pas sûr de gcc, mais pour g ++ j'ai dû ajouter l'option --whole-archive linker pour inclure les objets des bibliothèques statiques dans l'objet partagé. L'option --no-whole-archive est nécessaire si vous souhaitez créer un lien vers libc_static_lib.a et libother_shared_object.so, mais ne pas les inclure dans leur ensemble dans megalib.so.

17
Calm
ar -x lib***.a
gcc -shared *.o -o lib***.so
8

ar -x peut également être utile si vous souhaitez vous concentrer sur des objets spécifiques de votre .as et vous ne voulez rien ajouter par vous-même.

Exemples:

ar -x lib***.a
gcc -shared *.o -o lib***.so
3