Compilation de bibliothèque statique

Programming, Math, etc. · lab

Voir tous les documents en programmation

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

$