Comstackr une bibliothèque partagée de manière statique

J’ai une bibliothèque partagée avec des fonctions maison, que je comstack dans mes autres programmes, mais je dois lier le programme final à toutes les bibliothèques que j’ai utilisées pour comstackr la bibliothèque statique. Voici un exemple:

J’ai la fonction foo dans la bibliothèque qui nécessite une fonction d’une autre bibliothèque libbar.so .

Dans mon programme principal pour utiliser la fonction foo je dois le comstackr avec le drapeau -lbar . Existe-t-il un moyen de comstackr ma bibliothèque de manière statique afin qu’elle inclue tout le code requirejs des autres bibliothèques et que je puisse comstackr mon programme final sans avoir besoin de l’indicateur -lbar ?

Les objects partagés (.so) ne sont pas des bibliothèques, mais des objects. Vous ne pouvez pas en extraire une partie et l’insérer dans d’autres bibliothèques.

Ce que vous pouvez faire si vous construisez un object partagé qui référence l’autre – mais l’autre sera nécessaire au moment de l’exécution. Ajoutez simplement le -lbar lors de la liaison de libfoo.

Si vous êtes capable de construire libbar, vous pouvez évidemment créer une bibliothèque combinant libfoo et libbar. IIRC, vous pouvez également faire en sorte que l’éditeur de liens construise une bibliothèque qui soit libfoo et la partie nécessaire de libbar en liant un .a avec le .o destiné à aller dans libbar. Exemple:

 gcc -fPIC -c lib1.c # define foofn(), reference barfn1() gcc -fPIC -c lib2a.c # define barfn1(), reference barfn2() gcc -fPIC -c lib2b.c # define barfn2() gcc -fPIC -c lib2c.c # define barfn3() gcc -c main.c # reference foofn() ar -cru libbar.a lib2*.o gcc -shared -o libfoo.so lib1.o -L. -lbar nm libfoo.so | grep barfn2() # ok, not here gcc -o prog main.o -L. -lfoo env LD_LIBRARY_PATH=. ./prog # works, so foofn(), barfn1() and barfn2() are found 

Étape 1 (Créer un fichier object):

 gcc -c your.c -o your.o 

Étape 2 (Créer une bibliothèque statique):

 ar rcs libyour.a your.o 

Étape 3 (Lien contre la bibliothèque statique):

 gcc -static main.c -L. -lyour -o statically_linked 

Vous pouvez faire fonctionner ce genre de chose en utilisant libtool , consultez le manuel de libtool sur les dépendances entre bibliothèques pour obtenir un exemple de son fonctionnement.

Fondamentalement, si vous avez les bibliothèques liées statiquement des bibliothèques système dont dépend votre bibliothèque statique, vous pouvez lier de manière statique tout le code qu’elles contiennent.

Je ne sais pas pourquoi, cependant. * Le traitement des bibliothèques partagées par les plates-formes NIX est un travail de génie qui réduit considérablement la taille des programmes compilés. Si vous craignez de ne pas pouvoir exécuter de code sur un autre ordinateur en raison de bibliothèques manquantes, vous pouvez toujours utiliser le chemin de la plupart des programmes à source fermée compilés pour les bibliothèques Linux: comstackz-les -Wl,--rpath -Wl,. avec -Wl,--rpath -Wl,. options à GCC et dissortingbuez la bibliothèque à côté du binary.