Considérons le scénario suivant :
- Bibliothèque partagée libA.so ,sans aucune dépendance.
- Bibliothèque partagée libB.so, avec libA.so comme dépendance.
Je veux compiler un fichier binaire qui se lie avec la libB. Dois-je lier le fichier binaire avec la libB uniquement ou avec la libA également ?
Existe-t-il un moyen d'établir un lien uniquement avec les dépendances directes, en laissant la résolution des symboles non résolus des dépendances pour l'exécution ?
Je m'inquiète du fait que l'implémentation de la bibliothèque libB puisse changer dans le futur, introduisant d'autres dépendances (libC, libD, libE par exemple). Est-ce que je vais avoir des problèmes avec cela ?
En d'autres termes :
- Fichiers libA : a.cpp a.h
- Fichiers libB : b.cpp b.h
- Fichiers du programme principal : main.cpp
Bien entendu, b.cpp inclut a.h et main.cpp inclut b.h.
Commandes de compilation :
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
Laquelle des options suivantes dois-je utiliser ?
g++ main.cpp -o main -I. -L. -lB
ou
g++ main.cpp -o main -I. -L. -lB -lA
Je n'ai pas pu utiliser la première option. L'éditeur de liens se plaint des symboles non résolus de la bibliothèque libA. Mais cela me semble un peu étrange.
Merci beaucoup.
-- Commentaires mis à jour :
Lorsque je lie le binaire, l'éditeur de liens va essayer de résoudre tous les symboles de la main et de la libB. Cependant, la libB a des symboles non définis provenant de la libA. C'est pourquoi l'éditeur de liens se plaint de cela.
C'est pourquoi j'ai également besoin d'un lien avec la libA. Cependant, j'ai trouvé un moyen d'ignorer les symboles non résolus des bibliothèques partagées. Il semble que je doive utiliser la ligne de commande suivante pour le faire :
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
Il semble qu'il soit encore possible d'utiliser la fonction -rpath
option. Cependant, j'ai besoin de comprendre un peu mieux.
Quelqu'un connaît-il des pièges possibles lors de l'utilisation de l'option -Wl,-unresolved-symbols=ignore-in-shared-libs
option ?
-- Commentaires mis à jour 2 :
-rpath
ne doit pas être utilisé à cette fin. Il est utile de forcer une bibliothèque à être trouvée dans un répertoire donné. L'option -unresolved-symbol
semble bien meilleure.
Merci encore.