libfoo.so.majeur.mineur.
Quand vous liez un programme, l'éditeur de liens ld inclut
cette information dans le binaire créé. Vous pouvez voir ceci avec
ldd. Par la suite, lorsque vous lancez le programme,
l'éditeur de liens dynamique ld.so utilise cette information
pour trouver la bonne bibliothèque dynamique :
Les règles pour les bibliothèques partagées sont relativement simples.
Parfois, il arrive qu'une bibliothèque soit écrite en plusieurs fichiers, et que les fonctions internes doivent apparaitre comme visibles pour communiquer avec ces fichiers. Ces noms de fonction commencent traditionnellement avec un trait de soulignement, et ne sont pas une partie proprement dite de l'API.
Notez que le schéma de nommage des bibliothèques est omniprésent sur les plate-formes OpenBSD qu'elles soient ELF ou a.out.
gcc -shared -fpic|-fPIC -o libfoo.so.4.5 obj1
obj2
Renommez la bibliothèque après ceci afin d'ajuster le numéro de version ne marche pas : les bibliothèques ELF utilisent d'autres nombres magiques pour fixer le nom interne de la bibliothèque, et vous devriez ainsi la lier avec une version correcte dès la première fois.
D'un autre côté, rappelez vous que vous pouvez redéfinir les variables
du Makefile depuis la ligne de commande, en utilisant
MAKE_FLAGS dans le Makefile du port. Ceci est tout à fait
utile pour les ports basés sur la libtool par exemple, qui fournissent
une version variable pour chaque bibliothèque qu'ils créent.
Le meilleur moyen de gérer les ports basés sur libtool est d'utiliser la
variable
USE_LIBTOOL=Yes. Cela active la version de libtool présente
dans l'arbre des ports qui se charge automatiquement de la plupart des
détails :
SHARED_LIBS et remplace
automatiquement les numéros de version.
${WRKBUILD}/shared_libs.log qui peut être directement
intégré dans le Makefile du port.
ld utilise les drapeaux
-L pour régler les "paths" dans lequel regarder pour
une bibliothèque. Il arrête le parcour dès lors qu'il trouve une
bibliothèque qui correspond à sa recherche.
ld.so utilise l'information
mise en cache par ldconfig pour trouver la bibliothèque
requise.
qt.1.45
et qt.2.31. Puisque les deux ports peuvent être installés
simultanément, pour être sur qu'un programme donné sera lié avec qt.1,
cette bibliothèque est fournie avec
/usr/local/lib/qt/libqt.so.1.45, et les programmes seront
liés en utilisant ld -o program program.o -L/usr/local/lib/qt
-lqt. De même, un programme lié avec qt.2 utilisera le fichier
/usr/local/lib/qt2/libqt.so.2.31 avec ld -o program
program.o -L/usr/local/lib/qt2 -lqt.
Pour résoudre ces bibliothèques au moment du lancement, un lien appelé
/usr/local/lib/libqt.so.1.45 et un lien appelé
/usr/local/lib/libqt.so.2.31 sont fournis. Ceci est
suffisant pour satisfaire ld.so
Lier un programme en utilisant qt1 avec
ld -o program program.o -L/usr/local/lib -lqt est une
erreur. Ce code suppose que le qt.2.31 n'est pas installé,
ce qui est une fausse prétention.
De telles astuces sont uniquement nécessaires dans les rares cas de
bibliothèques dominantes ou une période de transition entre deux versions
majeures doit être fournie. En général, ceci est suffisant pour
s'assurer de la présence de la bibliothèque dans
/usr/local/lib.
make lib-depends-check pour
vérifier qu'un port mentionne toutes les bibliothèques requises.
Vous n'avez qu'a séparer les différentes bibliothèques avec des virgules,
comme ceci :
LIB_DEPENDS=gtk.1.2,gdk.1.2::x11/gtk+.
Spécifier les bibliothèques statiques sur la ligne LIB_DEPENDS n'est pas une
erreur à part entière. LIB_DEPENDS est évaluée intégralement au moment
de la construction du paquet : le paquetage résultant aura une information
de dépendance de bibliothèque inclut dans ld.so qui porte
le numéro majeur.mineur actuel qui était utilisé pour la construction,
mais rien pour les bibliothèques statiques.
Vous devez aussi fournir RUN_DEPENDS si un port requiert quelquechose au delà d'une bibliothèque proprement dite. Ceci permettra au port de se construire correctement sur les architectures qui ne supportent pas les bibliothèques partagées.
En fait, fournir les lignes LIB_DEPENDS pour les bibliothèques statiques est une bonne idée : ceci simplifiera la mise à jour du port si une dépendance donnée passe d'une bibliothèque statique à une bibliothèque partagée.
Les lignes LIB_DEPENDS doivent spécifier les même "paths" que ceux
utilisés par ld. Par exemple, le fragment qt2 standard dit
: LIB_DEPENDS+=lib/qt2/qt.2::x11/qt2, la ligne de
dépendance des bibliothèques pourra ainsi être correctement résolue. Ceci
permet au code de vérification des bibliothèques de faire le bon choix
quand plusieurs versions de la même bibliothèque sont découvertes.