2010-05-18 7 views
3

Je struggeling un peu avec quelques options pour relier un projet sur lequel je travaille actuellement sur:Lien une bibliothèque partagée statique à ma bibliothèque partagée

Je suis en train de créer une bibliothèque partagée qui est lié avec 2 autres bibliothèques. (Appelons-les libfoo.so et libbar.so)
Ma bibliothèque de sortie doit être une bibliothèque partagée et je veux lier statique libfoo.so à la bibliothèque résultante, mais libbar.so doit être lié comme une bibliothèque dynamique. (libbar.so devrait être disponible sur toutes les machines, où libfoo.so n'est pas disponible et je ne veux pas que l'utilisateur l'installe/l'envoie avec mes binaires.)

Comment est-ce que je peux l'archiver?

Mon instruction de construction actuelle ressemble à ceci:

c++ -Wall -shared -c -o src/lib.o src/lib.cpp 
c++ -Wall -shared -o lib.ndll src/lib.o -lfoo -lbar 

Je ma défense: Je ne suis pas un c/C++ expert, désolé si cette question semble être stupide.

+1

Il me semble que ce soit un double de http://stackoverflow.com/questions/2812079/compile-a- shared-library-static/2812137 – AProgrammer

+0

Je n'ai pas de version statique de libfoo.so – TheHippo

+0

Pour autant que je sache, ce n'est pas possible. Vous pouvez vérifier dans le manuel de l'éditeur de liens. – AProgrammer

Répondre

10

Il existe deux types de bibliothèques Linux C/C++.

  • bibliothèques statiques (*.a) sont des archives de code objet qui sont liés avec et devient une partie de la demande. Ils sont créés avec et peuvent être manipulés en utilisant la commande ar(1) (c'est-à-dire ar -t libfoo.a listera les fichiers dans la bibliothèque/archive).

  • Les bibliothèques d'objets partagés liés dynamiquement (*.so) peuvent être utilisés de deux manières.

    1. Les bibliothèques d'objets partagés peuvent être liées de manière dynamique au moment de l'exécution, mais sont statiquement reconnues. Les bibliothèques doivent être disponibles pendant la phase de compilation/liaison. Les objets partagés ne sont pas inclus dans l'exécutable binaire mais sont liés à l'exécution.
    2. Les bibliothèques d'objets partagés peuvent être chargées/déchargées dynamiquement et liées pendant l'exécution à l'aide des fonctions du système de chargeur de liens dynamiques.

Pour lier statiquement libfoo.so dans votre binaire, vous aurez besoin d'une bibliothèque statique correspondante qui est généralement appelé libfoo.a. Vous pouvez utiliser une bibliothèque statique en l'appelant dans le cadre du processus de compilation et de liaison lors de la création d'un programme exécutable.

Le résultat serait en train de changer votre commandes de construction à quelque chose comme ce qui suit:

g++ -Wall -fPIC -c -o src/lib.o src/lib.cpp 
g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so.1 src/lib.o -L/path/to/library-directory -lbar libfoo.a 
Questions connexes