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
estPremierde telle manière qu'elle renvoit 1 sinest premier et 0 sinon. Mettez le code de cette fonction dans un fichier appelécrible.cet 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 quepremierscontient suffisament d'élements. Le code de cette fonction devra être mis dans le fichiercrible.cet 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
statiqueet copiez y les fichierscrible.cetcrible.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.cencrible.oavecgccet 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
arpour 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
gcccompiler 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.aet 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
dynamiqueet placez y les fichierscrible.cetcrible.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
gccet 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
gccpour 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_PATHOn 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.soet 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
nmsur le fichiercrible.oobtenue pour la création de la bibliothèque statique.
Vous devriez voir apparaître les deux lignes suivantes :
000000000000003b T crible
0000000000000000 T estPremierOn 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.