Convertir une bibliothèque statique en une bibliothèque partagée?
-
19-08-2019 - |
Question
J'ai une bibliothèque tierce composée 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 fichier de bibliothèque .so
unique.
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 objets .o
en un seul .so
fichier?
La solution
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
Ne le faites pas?
Autres conseils
Vous ne pouvez pas faire cela si les objets de la bibliothèque statique ont été compilés sans -fPIC ou similaire.
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 de l'éditeur de liens --whole-archive 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, sans toutefois les inclure intégralement dans mégalib.so.
ar -x lib***.a
gcc -shared *.o -o lib***.so
ar -x
peut également être utile si vous souhaitez vous concentrer sur des objets spécifiques à partir de vos .a
et que vous ne souhaitez rien ajouter vous-même.
Exemples:
ar -x lib***.a
gcc -shared *.o -o lib***.so