g++: Dans quel ordre doit-statique et dynamique des bibliothèques être lié?
Disons que nous avons un exécutable principal appelé "my_app" et il utilise plusieurs autres bibliothèques: 3 bibliothèques sont liées statiquement, et 3 autres sont liés de façon dynamique.
Dans quel ordre doivent-ils être liés à l'encontre de "my_app"?
Mais dans quel ordre doivent-ils être liés?
Disons que nous avons eu libSA (comme en Statique A) qui dépend de l'libSB, et libSC qui dépend libSB:
libSA -> libSB -> libSC
et trois bibliothèques dynamiques:libDA -> libDB -> libDC
(libDA
est la base, libDC
est le plus élevé)
dans quel ordre doivent-ils être liés? la base d'une première ou la dernière?
g++ ... -g libSA libSB libSC -lDA -lDB -lDC -o my_app
semble que le currect ordre, mais est-ce donc? que faire si il y a des dépendances entre une bibliothèque dynamique à la statique, ou dans l'autre sens?
Vous devez vous connecter pour publier un commentaire.
Dans le cas statique, il n'a pas vraiment d'importance, parce que vous n'avez pas de lien de bibliothèques statiques - tout ce que vous faire est de pack de certains fichiers dans une archive. Tout ce que vous devez est de compiler vos fichiers objets, et vous pouvez créer des bibliothèques statiques tout de suite.
De la situation avec les bibliothèques dynamiques est plus compliqué, il y a deux aspects:
Une bibliothèque partagée fonctionne exactement de la même façon que la bibliothèque statique (sauf pour le partage de segments, s'ils sont présents), ce qui signifie, vous pouvez simplement faire la même chose, juste un lien de votre bibliothèque partagée dès que vous avez les fichiers de l'objet. Cela signifie, par exemple les symboles de libDA apparaît comme indéfini dans libDB
Vous pouvez spécifier les bibliothèques de lien sur la ligne de commande lors de la liaison des objets partagés. Cela a le même effet que 1., mais, les marques de libDB comme ayant besoin d'libDA.
La différence est que si vous utilisez l'ancienne manière, vous devez spécifier tous les trois bibliothèques (-lDA, -lDB, les pma) sur la ligne de commande lors de la liaison de l'exécutable. Si vous utilisez ce dernier, il suffit juste de préciser que les pma et il va tirer les autres automatiquement au moment de la liaison. Notez que la liaison est juste avant que votre programme fonctionne (ce qui signifie que vous pouvez obtenir différentes versions de symboles, même provenant de différentes bibliothèques).
Tout ceci s'applique à UNIX, Windows DLL fonctionne tout à fait différemment.
Modifier après la clarification de la question:
Citation de la
ld
info manuel.Qui signifie:
Statique de la bibliothèque ou de l'objet qui dépend d'autres de la bibliothèque doit être placé avant dans la ligne de commande. Si les bibliothèques statiques dépendent les uns des autres de façon circulaire, vous pouvez par exemple. utiliser le
-(
option de ligne de commande, ou de la place des bibliothèques dans la ligne de commande à deux reprises (-lDA -lDB -lDA
). L'ordre de bibliothèques dynamiques n'a pas d'importance.C'est le genre de question qui est le mieux résolu par un exemple trivial. Vraiment! Prenez 2 minutes, le code d'un exemple simple, et de l'essayer! Vous allez apprendre quelque chose, et c'est plus rapide que de demander.
Par exemple, compte tenu de fichiers:
a1.cc
a2.cc
a3.cc
aa.cc
En cours d'exécution:
Montre:
Considérant ce qui suit:
Réussit. (Juste au -la3 -la2 -la1 ordre des paramètres est modifié.)
PS:
De homme nm:
Si minuscules, le symbole est locale; si les majuscules, le symbole est global (externe).
"T" Le symbole est dans le texte (code) de la section.
"U" Le symbole n'est pas défini.
J'ai travaillé dans un projet avec un tas de bibliothèques internes qui, malheureusement, dépendaient les uns des autres (et cela s'est aggravé au fil du temps). Nous avons fini par "résoudre" ce par la mise en place SCons pour spécifier toutes les libs deux fois lors de la liaison:
Les dépendances pour la liaison d'une bibliothèque ou d'un exécutable à être présente à lien-temps, de sorte que vous ne pouvez pas lier libXC avant libXB est présent. Il n'a pas d'importance si statiquement ou dynamiquement.
Commencer avec le plus basique, qui n'a pas (ou juste à l'extérieur de votre projet) dépendances.
Il est de bonne pratique de garder les bibliothèques indépendantes les unes des autres pour éviter de lier l'ordre des questions.