Reportez-vous à :
http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/
Vous avez besoin de la version statique de la bibliothèque pour la lier.
Une bibliothèque partagée est en fait un exécutable dans un format spécial avec des points d'entrée spécifiés (et quelques problèmes d'adressage collants inclus). Il ne contient pas toutes les informations nécessaires pour établir un lien statique.
Vous ne pouvez pas lier statiquement une bibliothèque partagée (ou lier dynamiquement une bibliothèque statique).
Le drapeau -static
forcera l'éditeur de liens à utiliser des bibliothèques statiques (.a) au lieu de celles partagées (.so). Mais les bibliothèques statiques ne sont pas toujours installées par défaut, vous devrez donc peut-être installer la bibliothèque statique vous-même.
Une autre approche possible consiste à utiliser statifier ou Ermine. Les deux outils prennent en entrée un exécutable lié dynamiquement et en sortie créent un exécutable autonome avec toutes les bibliothèques partagées intégrées.
Si vous avez le fichier .a de votre bibliothèque partagée (.so), vous pouvez simplement l'inclure avec son chemin complet comme s'il s'agissait d'un fichier objet, comme ceci :
Cela génère main.o en compilant simplement :
gcc -c main.c
Cela lie ce fichier objet à la bibliothèque statique correspondante et crée l'exécutable (nommé "main") :
gcc main.o mylibrary.a -o main
Soit en une seule commande :
gcc main.c mylibrary.a -o main
Il peut également s'agir d'un chemin absolu ou relatif :
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Si vous souhaitez créer un lien, dites :libapplejuice statiquement, mais pas, disons, liborangejuice , vous pouvez créer un lien comme ceci :
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Il y a une mise en garde -- si liborangejuice
utilise libapplejuice
, puis libapplejuice
seront également liés dynamiquement.
Vous devrez lier liborangejuice
statiquement avec libapplejuice
pour obtenir libapplejuice
statique.
Et n'oubliez pas de conserver -Wl,-Bdynamic
sinon, vous finirez par lier tout ce qui est statique, y compris libc
(ce qui n'est pas une bonne chose à faire).
Oui, je sais que c'est une question vieille de 8 ans, mais on m'a dit qu'il était possible d'établir un lien statique avec une bibliothèque d'objets partagés et c'était littéralement le meilleur résultat lorsque j'ai cherché plus d'informations à ce sujet.
Pour démontrer réellement que la liaison statique d'une bibliothèque d'objets partagés n'est pas possible avec ld
(gcc
's linker) -- par opposition à un groupe de personnes insistant sur le fait que ce n'est pas possible -- utilisez le gcc
suivant commande :
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Bien sûr, vous devrez compiler objectname.o
à partir de sourcename.c
, et vous devriez probablement aussi créer votre propre bibliothèque d'objets partagés. Si vous le faites, utilisez -Wl,--library-path,.
afin que ld puisse trouver votre bibliothèque dans le répertoire local.)
L'erreur réelle que vous recevez est :
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
J'espère que ça aide.