Introduction.
Intérêt ?
Imaginez : Vous avez développé une série de fonctions très utiles pour
un projet, prenons l'exemple d'un tri par bulles. Un jour, vous devez
effectuer une nouvelle série de tris. Vous ouvrez le projet et passez la
journée à faire du copier coller ?!?! NON !!! car vous aviez
pensé à créer un librairie contenant la fonction principale du tri, n'est ce pas ?
Les librairies permettent de se constituer des bibliothèques de fonctions
réutilisables et distribuables.
Vous voulez un autre avantage des librairies ?
On les compile à part ! Si vous avez comme moi un pc qui se fait vieux, vous savez
que la compilation peut prendre pas mal de temps. La bonne nouvelle c'est qu'une
fois les librairies compilées, vous ne les recompilez pas à chaque fois que vous
recompilez votre projet. Tout au plus, vous les liez, s'il s'agit de bibliothèques
statiques.
Qu'est ce qu'il y a dedans ?
Une librairie est composée d'un fichier d'en têtes (headers en anglais, d'ou le .h), ce sont les fichiers .h
qui doivent vous dire quelque chose, non ? Et d'un partie binaire.
Le fichier d'en têtes, permet de "déclarer" les fonctions présentes
dans la librairie, le type de valeurs qu'elles renvoient et les paramètres
à leur passer.
La partie binaire est constituée d'un ou plusieurs fichiers c compilés. Ces fichiers
c contiennent l'implémentation des prototypes de fonctions déclarées dans le fichier d'en têtes.
Vous pouvez modifier le code de la librarie autant que vous le désirez, du moment
que vous respectez les prototypes définis dans le fichier .h.
Statique, Dynamique ?
Ouais, entrons dans le vif du sujet. Qu'est ce qu'une librairie statique ?
et une librairie dynamique ? Quelles sont les avantages et inconvénients de
chacune ?
- Quand vous utilisez une librairie statique (généralement .a sous linux, .lib sous ouinouin)
la librairie est liée à l'exécutable généré. C'est à dire que vous obtenez un fichier exécutable
relativement "lourd".
D'autre part, si vous apportez des modifications à la librairie, vous devez
recompiler la librairie ET l'exécutable.
Bon coté : lorsque vous distribuez votre application, l'exécutable contient
tout ce qui lui est nécessaire pour fonctionner, ce qui évite les problèmes de dépendances.
- L'utilisation des librairies dynamiques apporte plusieurs avantages :
- La librairie est liée au programme qui l'utilise lors de l'exécution, l'exécutable distribué
est ainsi plus léger que dans le cas d'une librairie statique.
- La librarie n'est chargée qu'une fois en mémoire, même si elle est utilisée par plusieurs exécutables.
- Lors de modifications apportées à la librarie, l'application l'utilisant
n'a pas besoin d'être recompilée, à la condition toutefois que ces changements
respectent les prototypes définis dans le fichier d'en têtes.
Mais il y a aussi des inconvénients :
- Pour exécuter une application faisant appel à une librarie dynamique,
vous devez posséder ces librairies et elles doivent pouvoir être trouver par le système.
Nous verrons plus loin quelques façons de vérifier tout celà.
- Le temps de lancement peut être plus long, étant donné que la liaison
se fait lors de l'exécution.
Nota Bene : les liens avec les librairies dynamiques
ne se font pas toujours lors de l'exécution, un programme peut en effet
charger lui même les librairies dont il a besoin quand il en a besoin (voir les
fonctions dlopen() et dlsym()), Celà est utile pour construire l'application au fur
et à mesure de son exécution. Imaginez par exemple que vous écriviez un programme
de retouche d'image, pourquoi charger les libraries de traitement de fichier jpeg
si pendant une "session" l'utilisateur ne se sert que de fichiers .png ?
Plus d'infos sur cette page ?
Consultez les pages man de dlopen et dlsym et celles qui y sont conseillées et tapant dans la console
man dlopen
man dlsym
a+