Comment faire le versionnage d’une bibliothèque partagée sous Linux?

Depuis Windows fournit le fichier de ressources pour la version d’une application et DLL. Mais comment pouvons-nous le faire sous Linux avec une bibliothèque partagée. Nous avons une bibliothèque partagée et aimons append des informations de version.

La version courte est que vous faites cela via le soname de la bibliothèque. Lisez le chapitre 3 à l’ adresse http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html ainsi que le chapitre 3.3 Gestion des versions ABI à l’ adresse http://www.akkadia.org/drepper/dsohowto.pdf

Linux utilise la stratégie suivante: vous (le responsable du système) fournissez des liens symboliques à partir d’un fichier de bibliothèque partagé «spécifique», comme ceci:

lrwxrwxrwx 1 root root 16 2011-09-22 14:36 libieee1284.so -> libieee1284.so.3 lrwxrwxrwx 1 root root 20 2011-09-22 14:36 libieee1284.so.3 -> libieee1284.so.3.2.2 -rw-r--r-- 1 root root 46576 2011-07-27 13:08 libieee1284.so.3.2.2 

De cette façon, les développeurs peuvent se lier soit à -lieee1284 (n’importe quelle version ABI), soit à libieee1284.so.3 ou même à la version spécifique de la version et du correctif (3.2.2).

La meilleure façon de gérer cela est d’utiliser libtool, qui gère les versions pour vous.

Essentiellement, les informations de version ne sont pas (ou pas principalement, ignorées de ma tête) encodées dans la bibliothèque elle-même, mais plutôt dans son nom de fichier. Les numéros de version sont normalement donnés au format à trois points, le nombre majeur augmentant pour chaque rupture de compatibilité ABI, le milieu pour les ruptures de compatibilité ABI vers le haut et le mineur pour les correctifs ne modifiant pas l’ABI.

Comme qdot a noté, les liens symboliques dans le répertoire lib fournissent le versionnage essentiel. Il existe un lien symbolique sans numéro de version (libfoo.so) pour les en-têtes de développement actuellement installés, un lien symbolique avec un numéro majeur pour chaque version majeure installée (libfoo.so.1) et un fichier réel avec le numéro de version complet. Normalement, les programmes sont liés pour utiliser libfoo.so.1 à l’exécution, de sorte que plusieurs versions majeures peuvent coexister.