Les numéros de Version de l'objet partagé des fichiers
Je suis en train de construire un fichier objet partagé à partir d'un groupe de fichiers source C++ avec GCC. Tous les exemples de tutoriels sur la construction de .so
fichiers afficher le fichier créé avec un numéro de version après la .so
suffixe. Par exemple:
gcc -shared -Wl,-soname,libmean.so.1 -o libmean.so.1.0.1 calc_mean.o
Ce serait de produire la .so
fichier libmean..1.0.1
En outre, si je navigue dans le /usr/lib
répertoire sur ma machine locale, je vois que beaucoup de la .so
fichiers ont des numéros de version à la fin.
Cependant, quand je compile un fichier objet partagé et le placer dans /usr/lib
, le linker ne trouve pas ça si j'ai mis un numéro de version à la fin. Si je supprime le numéro de version, il fonctionne très bien. J'ai vraiment ne se soucient pas de mettre un numéro de version ou pas, je ne comprends juste pas pourquoi cela semble être d'une convention commune, et pourtant, cela provoque la bibliothèque partagée de ne pas travailler avec l'éditeur de liens. Donc, ce qui se passe ici? Pourquoi est-il une convention pour placer le numéro de version à la fin d'une .so
nom de fichier?
OriginalL'auteur Channel72 | 2011-04-22
Vous devez vous connecter pour publier un commentaire.
Le numéro de version est ajouté de sorte que vous pouvez avoir plusieurs incompatible bibliothèque versions coexistent dans le système. Vous devez incrémenter le numéro de version majeure (le nombre
soname
) chaque fois que vous changez l'API d'une façon incompatible (en supposant que la version précédente est installé et utilisé dans le système, bien sûr).Les 2e et 3e chiffres dans le nom de fichier permet de multiples révisions mineures de la bibliothèque dans le système, commutable à l'échelle du système avec un simple lien symbolique de mise à jour.
Au moment de la liaison, vous pouvez donner le
.so
nom de fichier comme un éditeur de liens argument, au lieu de-l
option. ldd est assez intelligent pour extraire lesoname
, le binaire lié de cette manière qu'il utilise pour trouver la bibliothèque.Par exemple, nous allons compiler la bibliothèque et binaire de test à l'aide de:
Vous pouvez utiliser la commande ldd à vérifier, que le binaire regarde maintenant pour
libtest.so.2
:Il est évident qu'elle ne peut pas le trouver, mais c'est ce que le lien est:
Mise à jour: Tout ce qui précède est vrai, mais je n'étais pas moi-même conscient de la signification de la composante 3 du numéro de version. Jusqu'à récemment, je pense que c'est simplement un numéro de patch (ou autre chose). Faux! Pour libtool il a une signification particulière.
La 3ème composante s'est avéré être âge champ, qui dit combien de versions principales sont rétro-compatibles avec une.
Lecture recommandée:
D'abord l'un des 2 liens dans "lectures recommandées" points de Martin Sustrik de l'article du blog, qui explique assez bien.
Hmm, peut-être que la réponse est en effet la peine de mise à jour, je vais faire dans un instant.
OriginalL'auteur Code Painters