Lien statique de la bibliothèque partagée de la fonction de gcc
Comment puis-je lier une bibliothèque partagée fonction de façon statique dans gcc?
- Qu'entendez-vous par statiquement? Voulez-vous votre exécutable à distribuited sans exiger de l' .de la sorte?
Vous devez vous connecter pour publier un commentaire.
Se référer à:
http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Vous avez besoin de la version statique de la bibliothèque de lien.
Une bibliothèque partagée est en fait un fichier exécutable dans un format spécial
avec des points d'entrée spécifié (et certains collant aborder les questions
inclus). Il n'a pas toutes les informations nécessaires pour
lier de manière statique.
Vous ne pouvez pas lier statiquement bibliothèque partagée (ou d'un lien dynamique statique)
Drapeau -statique de la force de l'éditeur de liens pour utiliser la bibliothèque statique (.a) au lieu de partagé (.donc)
Mais. Les bibliothèques statiques sont pas toujours installé par défaut. Donc, si vous avez besoin de lien statique, vous devez installer les bibliothèques statiques.
Une autre approche possible est d'utiliser statifier ou Hermine. Les deux outils prennent en entrée de façon dynamique exécutable lié et que la sortie de créer exécutable autonome avec toutes les bibliothèques partagées intégré.
Si vous voulez le lien, dire, libapplejuice de manière statique, mais pas, disons, liborangejuice, vous pouvez faire un lien comme ceci:
Il y a un bémol-si
liborangejuice
utiliselibapplejuice
, puislibapplejuice
sera liée dynamiquement trop.Vous devez associer
liborangejuice
de manière statique aux côtés de lalibapplejuice
pour obtenirlibapplejuice
statique.Et n'oubliez pas de garder
-Wl,-Bdynamic
d'autre, vous vous retrouverez des liens tout statique, y comprislibc
(ce qui n'est pas une bonne chose à faire).gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB utilise il, elle a lié etldd
ne montre pas une référence à il. L'exécutable fonctionne très bien. Testé avec g++ 4.7.3.Si vous avez l' .un fichier de votre bibliothèque partagée (.), vous pouvez simplement inclure avec son chemin d'accès complet, comme si c'était un objet fichier, comme ceci:
Cela génère principal.o par juste de la compilation:
Ce liens que le fichier de l'objet correspondant à la bibliothèque statique et crée l'exécutable (nommé "main"):
Ou en une seule commande:
Il pourrait aussi être un chemin relatif ou absolu:
Un peu en retard mais ... j'ai trouvé un lien que j'ai sauvé il y a quelques années et j'ai pensé qu'il pourrait être utile pour vous les gars:
CDE: créer Automatiquement portable applications Linux
http://www.pgbovine.net/cde.html
Exécuter le binaire en passant comme argument le nom de l'exécutable que vous voulez faire portable, par exemple: nmap
./cde_2011-08-15_64bit nmap
Le programme va lire tous libs lié à nmap et ses dependencias et il sera de toutes les enregistrer dans un dossier appelé cde-package/ (dans le même répertoire que vous êtes).
Rappelez-vous, pour lancer le programme portable, vous avez à exec le binaire situé dans cde-package/nmap.cde
En ce qui concerne meilleur
Oui, je sais, c'est un 8 ans question, mais on m'a dit qu'il était possible de lier statiquement à l'encontre d'un shared object library et cela a été littéralement le top frappé quand j'ai cherché pour plus d'informations à ce sujet.
À démontrer que la liaison statique partagée-bibliothèque d'objets n'est pas possible avec
ld
(gcc
's de l'éditeur de liens), contrairement à tout un tas de gens insistant sur le fait qu'il n'est pas possible, utiliser les éléments suivantsgcc
commande:(Bien sûr, vous aurez pour compiler
objectname.o
desourcename.c
, et vous devriez probablement faire votre propre partagée la bibliothèque d'objets ainsi. Si vous le faites, utilisez-Wl,--library-path,.
de sorte que ld pouvez trouver votre bibliothèque dans le répertoire local.)L'erreur que vous recevez est:
Espère que ça aide.
Dans gcc, ce n'est pas pris en charge. En fait, ce n'est pas pris en charge dans un compilateur/linker, je suis conscient de.