TP ‐ Création de bibliothèque - vbridonneau/CoursSysteme GitHub Wiki
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.
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);
- Coder la fonction
estPremier
de telle manière qu'elle renvoit 1 sin
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êtecrible.h
.
On va maintenant pouvoir créer notre fonction crible
avec le prototype suivant :
int *crible(int *taille, 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.
- Coder la fonction
crible
. On supposera évidemment quepremiers
contient suffisament d'élements. Le code de cette fonction devra être mis dans le fichiercrible.c
et son prototype dans le fichiercrible.h
.
Nous allons à présent créer la bibliothèque à partir du code source.
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.
- Créez un répertoire
statique
et copiez y les fichierscrible.c
etcrible.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.
- Compiler le fichier
crible.c
encrible.o
avecgcc
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.
- Utilisez la commande
ar
pour créer la bibliothèque. On nommera cette bibliothèquelibcrible.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
).
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 taille;
int *premiers = crible(&taille, N);
int i;
for (i = 0; i < nbPremiers; i++) {
printf("%d ", premiers[i]);
}
printf("\n");
free(premiers);
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
-
En utilisant
gcc
compiler le programme précédent pour qu'il puisse utiliser la bibliothèquelibcrible.a
. -
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 ?
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.
- Créez le répertorie
dynamique
et placez y les fichierscrible.c
etcrible.h
.
Pour compiler des fichiers afin d'en faire une bibliothèque dynamique, il va falloir précisez à gcc
une option : -fPIC
.
- 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]
- Utilisez
gcc
pour créer la bibliothèquelibcrible.so
.
Notes : ici le nom de la bibliothèque se termine par l'extension .so et non .a !!
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 :
- 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 ?
Nous les verrons lors de la correction
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.
- Utilisez le programme
nm
sur le fichiercrible.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.