GNU/Linux >> Tutoriels Linux >  >> Linux

Lien statique de la fonction de bibliothèque partagée dans gcc

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.


Linux
  1. Linux - Surveillance à l'échelle du système des appels à une fonction de bibliothèque ?

  2. La bibliothèque Libsdl partagée ne s'ouvre pas ?

  3. Introduction aux bibliothèques partagées Linux (comment créer des bibliothèques partagées)

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

  5. Comment lier statiquement un programme complexe

Compilation dynamique de la bibliothèque partagée avec g++

Comment faire le versioning d'une bibliothèque partagée sous Linux ?

Quelle est la signification de l'avertissement :Lier la bibliothèque partagée à la bibliothèque statique n'est pas portable ?

Différence entre les objets partagés (.so), les bibliothèques statiques (.a) et les DLL (.so) ?

Comment configurer googleTest en tant que bibliothèque partagée sous Linux

Erreur lors du chargement de la bibliothèque partagée (glew)