Compilation de bibliothèque statique
La compilation de bibliothèques ne pose pas de difficultés particulières,
mais nécessite des options en ligne de commande rarement utilisées.
Dans ce premier exercice, vous allez réaliser une compilation de
bibliothèque statique.
fichier nommé fact.c contenant
Créez un
l'implémentation d'une
fonction factorielle(), ainsi qu'un fichier fact.h contenant le prototype de
votre fonction.
la
Créez un programme nommé calcule_factorielle.c qui
routine factorielle() pour chaque argument de la ligne de commande, et
affiche le résultat.
invoque
fichier objet
Compilez d'abord votre bibliothèque pour obtenir un
nommé fact.o. Employez ensuite l'archiveur ar(1) et son option rcs pour
créer une bibliothèque nommée libfact.a contenant
Publicité
fichier objet
précédent.
le
Vous pouvez à présent compiler le programme calcule_factorielle.c pour
obtenir un fichier exécutable. Pour cela il faut ajouter l'option -static sur la
ligne de commande. Il faut également indiquer la bibliothèque à inclure
avec l'option -lfact après le fichier source à compiler. N'oubliez pas
d'employer l'option -L pour préciser l'emplacement de la bibliothèque.
factsol.c
/**\
libfactsol
Bibliothèque implémentant la fonction factorielle()
Travaux pratiques de la formation "Linux en Environnement Industriel"
(c) 2005 Christophe Blaess
\**/
long int
factorielle(long int n)
{
long int f = 1;
Publicité
while(n > 1) {
f = f * n;
n = n - 1;
}
return f;
}
Le programme utilisant la factorielle est ici :
calcule_factorielle_sol.c
/**\
calcule_factorielle_sol
Programme faisant appel à la bibliothèque implémentant la fonction
factorielle().
Travaux pratiques de la formation "Linux en Environnement Industriel"
(c) 2005 Christophe Blaess
\**/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <factsol.h>
Publicité
int
main (int argc, char * argv[])
{
long int n;
int i;
if (argc < 2) {
fprintf(stderr, "usage: %s valeurs...\n", argv[0]);
exit(EXIT_FAILURE);
}
for (i = 1; i < argc; i ++)
if (sscanf(argv[i], "%ld", & n) == 1)
fprintf(stdout, "%ld! = %ld\n", n, factorielle(n));
return EXIT_SUCCESS;
}
Et voici les étapes de compilation :
$ ls -l fact
-rw-r--r-- 1 ccb ccb 754 avr 30 02:48
calcule_factorielle_sol.c
-rw-r--r-- 1 ccb ccb 431 avr 30 03:13 factsol.c
Publicité
-rw-r--r-- 1 ccb ccb 92 avr 29 09:34 factsol.h
$ gcc -I. -c factsol.c
$ ls -l fact
-rw-r--r-- 1 ccb ccb 754 avr 30 02:48
calcule_factorielle_sol.c
-rw-r--r-- 1 ccb ccb 431 avr 30 03:13 factsol.c
-rw-r--r-- 1 ccb ccb 92 avr 29 09:34 factsol.h
-rw-r--r-- 1 ccb ccb 727 avr 30 03:26 factsol.o
$ ar -rcs libfactsol.a factsol.o
$ gcc -static -I. -L. calcule_factorielle_sol.c -
lfactsol -o calcule_factorielle_sol_static
$ ./calcule_factorielle_sol_static 8
8! = 40320
$