Création de librairies en C

Portrait de trax

Pré-requis

  • Base (pH > 7) en C
  • Compilation sépare
  • Ce tutoriel

Pourquoi ?

Depuis son invention, la roue a été de pierre, de bois, de caoutchouc, mais toujours de la même forme. Réinventer une nouvelle méthode de faire un cylindre, n'a souvent que peu d'importance.
Les librairies permettent de factoriser du code réutilisé fréquemment. Le développeur doit alors rajouter la couche qui fera de sa roue une roue différentes de celles pré-existants.

Il existe deux types de librairies : statiques ou dynamiques.

Le premier permet de de créer des librairies qui seront inclus dans le binaire lors de la compilation. Cela permet de ne pas se soucier de la présence ou non de la librairies sur le pc sur lequel va être exécute le programme. L'inconvénient étant bien évidement un binaire plus lourd.

Quant aux librairies dynamiques elles créent des objets (fichier en .so sous Linux, .dll sous Wind...) qui sont chargées par l'OS à l'exécution (à ne pas confondre avec avec le chargement dynamique vu dans un autre tutoriel).

Le principe

Les librairies ne différents des programmes > que par leur point d'entre : il n'y a pas besoin de fonction main(). Il n'y a qu'a écrire le code des fonctions comme vous l'auriez fait de manière classique.

La compilation se fait de la même manière (la compilation seulement et non l'édition de lien). Nous commençons donc par créer nos objet (.o) puis nos fichiers librairies.

En action

soit les fichiers lib0.c et lib0.h

lib0.c

  1. #include "lib0.h"
  2. int test (int x){
  3. return x+42;
  4. }

lib0.h

  1. #ifndef LIB0_H
  2. #define LIB0_H
  3. int test (int);
  4. #endif

Ligne de compilation :

  1. gcc -Wall -c -fPIC lib0.c -o lib0.o
  2. gcc -shared -Wl,-soname,libtest.so lib0.o -o libtest.so

Il est possible de donner un nom de librairie différent de celui du fichier de la librairie en utilisant l'option soname.

Les fichiers lib0.o et libtest.so sont alors généré.

Ecrivons maintenant un code qui utilise notre librairie.

  1. #include <stdio.h>
  2. #include "lib0.h"
  3.  
  4. int main(){
  5. printf("%d\n",test(42));
  6. return 0;
  7. }

que nous compilons avec la ligne

gcc -Wall -L./ -ltest main.c -o prog 

-L indique le répertoire ou cherche la librairie : ici, c'est le répertoire courant
-l précise le nom de la librairie sans le préfixe "lib"