TP ‐ Création de bibliothèque - vbridonneau/CoursSysteme GitHub Wiki

Création de bibliothèque

Dans ce TP, nous allons voir comment compiler et créer des bibliothèques en C. Une bibliothèque est un regroupement de fonctions et de variables C représentant souvant des fonctionnalités non implémentées dans la bibliothèque standard du C. Parmi elles, on peut citer la SDL, qui permet de créer des fenêtres graphiques et de gérer les interactions avec un utilisateur, ou encore la bibliothèque mathématique m permettant d'accéder aux fonctions définies dans le header math.h.

Ici, on se propose de créer notre propre bibliothèque. Nous allons voir deux types de bibliothèques différentes ainsi que les façons de les créer.

Développement

Voyons dans un premier temps quelle bibliothèque nous allons créer. Il s'agit d'une bibliothèque permettant de construire un crible d'Ératosthène. Un crible d'Ératosthène est un tableau d'entiers qui va contenir l'ensemble des nombres premiers inférieurs ou égaux à un nombre entier N. Pour rappel, un nombre premier est un nombre entier naturel (positif) qui admet exactement deux diviseurs entiers naturels. Par exemple, 1 n'est pas premier (il n'a qu'un seul diviseur), en revanche 2 et 3 le sont, mais pas 4 (car 4 = 2*2).

On se propose dans un premier temps de coder une fonction estPremier ayant le prototype suivant :

int estPremier(int n);
  1. Coder la fonction estPremier de telle manière qu'elle renvoit 1 si n est premier et 0 sinon. Mettez le code de cette fonction dans un fichier appelé crible.c et son prototype dans un fichier d'entête crible.h.

On va maintenant pouvoir créer notre fonction crible avec le prototype suivant :

int crible(int *premiers, int N);

Cette fonction calcule donc un crible d'Érathostène et stocke les nombres prmiers dans le tableau premiers. Le paramètre N correspond à la borne évoquée précédement. Le retour de la fonction correspond au nombre de nombres premiers trouvés.

  1. Coder la fonction crible. On supposera évidemment que premiers contient suffisament d'élements. Le code de cette fonction devra être mis dans le fichier crible.c et son prototype dans le fichier crible.h.

Création de la bibliothèque

Nous allons à présent créer la bibliothèque à partir du code source.

Bibliothèque statique

Nous allons dans un premier temps voir comment créer une bibliothèque statique.

Pour ce faire, nous allons créer un répertoire où placer le code source de la bibliothèque ainsi que la bibliothèque elle même.

  1. Créez un répertoire statique et copiez y les fichiers crible.c et crible.h.

La seconde étape consiste à compiler la librairie. Attention, ici on ne compile pas un programme car il n'y a pas de fonction main. L'objectif est de créer un fichier objet à partir du code source.

  1. Compiler le fichier crible.c en crible.o avec gcc et l'option -c.

La troisième et dernière étape de la création d'une bibliothèque statique est l'archivage des fichiers objets. Pour réaliser cette étape, nous allons utiliser le programme ar. Il s'utilise comme suit pour créer une bibliothèque.

ar crs libbiblio.a [fichiers objets] # [fichiers objets] doit être remplacé par les fichiers objets.
  1. Utilisez la commande ar pour créer la bibliothèque. On nommera cette bibliothèque libcrible.a.

Notes : pour créer une bibliothèque nommée crible, il faut nommer le fichier libcrible.a (commencer par lib et ajouter l'extension .a).

Test

Pour vérifier que tout fonction correctement, nous allons tester notre bibliothèque. On se propose d'utiliser le programme suivant :

#include <stdio.h>
#include "crible.h"

#define N 100000000

int main() {
    int premiers[N];
    int nbPremiers = crible(premiers, N);
    int i;
    for (i = 0; i < nbPremiers; i++) {
        printf("%d ", premiers[i]);
    }
    printf("\n");
    return 0;
}

Pour compiler un programme avec une bibliothèque il faut ajouter l'option -l. Par exemple, pour pouvoir utiliser la fonction C srqt définie dans le fichier math.h, il faut écrire :

gcc programme.c -lm
  1. En utilisant gcc compiler le programme précédent pour qu'il puisse utiliser la bibliothèque libcrible.a.

  2. Exécutez votre programme. Fonctionne-t-il ? Que se passe-t-il si vous supprimez le fichier libcrible.a et que vous relancez votre programme ?

Bibliothèque dynamique

Nous allons à présent voir comment créer une bibliothèque dynamique.

Comme pour la première partie, nous allons créer un répertoire dynamique dans lequel nous allons placer le code source de la bibliothèque.

  1. Créez le répertorie dynamique et placez y les fichiers crible.c et crible.h.

Pour compiler des fichiers afin d'en faire une bibliothèque dynamique, il va falloir précisez à gcc une option : -fPIC.

  1. Compiler avec vos fichiers sources en objets avec gcc et l'option -fPIC.

Il ne reste plus qu'à créer la bibliothèque. Pour cela, on utilisera gcc avec l'option -shared :

gcc -shared -o libbiblio.so [fichiers objets]
  1. Utilisez gcc pour créer la bibliothèque libcrible.so.

Notes : ici le nom de la bibliothèque se termine par l'extension .so et non .a !!

Test

Pour tester que notre bibliothèque fonctionne bien, nous allons reprendre le programme de test précédent et lier le programme avec notre bibliothèque. Pour cela, il suffit d'écrire la même commande que pour une bibliothèque statique, mais il va falloir définir une variable d'environnement appelée LD_LIBRARY_PATH :

LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

On peut donc maintenant exécuter notre programme :

  1. Exécutez votre programme test une fois celui-ci compilé et lié à la bibliothèque. Que se passe-t-il si vous supprimez le fichier libcrible.so et que vous relancez votre programme ? Pourquoi ?

Différence entre bibliothèque statique et dynamique

Nous les verrons lors de la correction

Pour aller plus loin

Liste des symboles

Un fichier objet (.o) contient les fonctions implémentées dans le fichier .c qui lui correspond et compilées en langage machine. On peut voir quelles fonctions sont ainsi définies en utilisant la fonction nm. Ces fonctions sont représentées sous forme de symboles.

  1. Utilisez le programme nm sur le fichier crible.o obtenue pour la création de la bibliothèque statique.

Vous devriez voir apparaître les deux lignes suivantes :

000000000000003b T crible
0000000000000000 T estPremier

On peut donc voir que notre fichier contient deux symboles : estPremier et crible. La lettre T signifie que le symbole est présent dans le fichier.

⚠️ **GitHub.com Fallback** ⚠️