63 votes

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

J'ai une bibliothèque tierce qui consiste principalement en un grand nombre d'éléments statiques ( .a ) de la bibliothèque. Je peux compiler tout cela en un seul .a mais j'ai vraiment besoin qu'il s'agisse d'un seul fichier de bibliothèque. .so fichier de bibliothèque partagée.

Existe-t-il un moyen de convertir un fichier statique .a dans un fichier partagé .so ? Ou plus généralement, existe-t-il un bon moyen de combiner un grand nombre de fichiers statiques .a avec quelques .o en un seul fichier d'objets .so fichier ?

54voto

dicroce Points 11988

Fait ceci (avec les -L appropriés bien sûr)

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

Ne pas le faire ?

7 votes

Utiliser gcc -shared a fait l'affaire, mais seulement après avoir recompilé avec -fPIC. Merci de m'avoir indiqué la bonne direction !

0 votes

Je sais que c'est une vieille réponse mais cela... ne fonctionne pas ? Avec toutes les bibliothèques statiques que j'ai essayées, l'objet partagé résultant n'exporte plus aucun des symboles originaux.

0 votes

J'ai rencontré le même problème @Peter

29voto

vitaly.v.ch Points 1143

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

3 votes

Sur des cibles bien soutenues, PIC n'est pas indispensable pour le code de la bibliothèque partagée. Il en résulte simplement une utilisation beaucoup plus efficace de la mémoire (la majorité, au lieu d'une minorité, des pages peuvent être partagées) au détriment de certaines performances.

4 votes

L'absence de -fPIC ou autre dans certaines conditions entraîne une erreur de segmentation.

19voto

Calm Points 51
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 pour 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 voulez lier à libc_static_lib.a et libother_shared_object.so, mais ne pas les inclure dans leur ensemble dans megalib.so.

5 votes

-Wl--no-whole-archive est nécessaire à la fin de la ligne de commande. Voir l'édition de la question, ici .

10voto

ar -x peut également être utile si vous voulez vous concentrer sur des objets spécifiques de votre .a et vous ne voulez pas ajouter quoi que ce soit par vous-même.

Exemples :

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

7voto

Artur Shaikhullin Points 155
ar -x lib***.a
gcc -shared *.o -o lib***.so

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X