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
?
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?
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 --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.
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 de votre .a
s et vous ne voulez rien ajouter par vous-même.
Exemples:
ar -x lib***.a
gcc -shared *.o -o lib***.so