2 votes

C++ : comment lier contre libA.so et non pas libA-X.Y.Z.so

J'ai une bibliothèque A que je développe. Lorsque je la déploie sur une machine, les fichiers libA.so et libA-X.Y.Z.so correspondants sont placés dans /usr/lib (X.Y.Z étant le numéro de version).

Maintenant, je développe une bibliothèque B qui utilise A. Lorsque je lie B, j'utilise le drapeau -lA. Ensuite, "ldd libB.so" me donne :

(...)
libA-X.Y.Z.so => /usr/lib/libA-X.Y.Z.so
(...)

Mon problème est que lorsque je publie une nouvelle version de A (X.Y.ZZ), je dois aussi publier une nouvelle version de B. Sinon, quelqu'un installant la dernière version de A ne pourra pas installer B qui cherchera la version X.Y.Z qui n'existe pas.

Comment résoudre ce problème ? Comment puis-je dire à B de rechercher libA.so et non libA-X.Y.Z.so ? Est-ce faux ou même dangereux de le faire ?

Mise à jour 1 : la bibliothèque A (que j'ai héritée de quelqu'un d'autre) utilise autotools.

Mise à jour 2 : lorsque je construis la bibliothèque A, je peux voir : "-Wl, -soname -Wl, libA-0.6.1.so". Si je comprends bien, cela signifie que nous forçons le soname à être libA-0.6.1.so. Est-ce correct ? Maintenant, mon problème est que je n'ai aucune idée de comment modifier ce comportement dans un projet qui utilise autotools. J'ai cherché sur Google pendant un moment mais je ne trouve aucune information utile. Devrais-je modifier configure.in ou un Makefile.am ?

5voto

Martin v. Löwis Points 61768

Lorsque vous créez libA.so, passez l'option -soname au linker (si vous liez en utilisant gcc, utilisez -Wl,-soname). Ensuite, lorsque B est lié, le linker fait référence à A via son soname, pas via son nom de fichier. Sur le système cible, assurez-vous d'avoir un lien du soname vers le vrai fichier. Voir

http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html

0voto

Marcin Gil Points 16951

Cela fonctionne également sous Windows comme "DLL hell" :).

Si B a besoin d'une version spécifique de A et que vous liez à libA et non à libA-X.Y.Z, alors simplement remplacer libA par une version plus récente pourrait empêcher B de se charger ou entraîner un plantage.

Mais bien sûr, vous pouvez créer un lien symbolique de libA-X.Y.Z vers libA-X1.Y1.Z1. Si aucune API n'a changé et seuls les implémentations alors vous devriez être en sécurité.

0voto

Barth Points 2176

Répondant à ma deuxième mise à jour : Dans le Makefile.am de libA, j'ai modifié _la_LDFLAGS de -release à -avoid-version. Cela a créé une bibliothèque partagée sans numéro de version et j'ai ensuite recompilé libB qui s'est correctement liée à cette bibliothèque partagée sans numéro de version.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X