Compilation de bibliothèque statique

Page 1 sur 6Lecteur de document UniversityLib

Compilation de bibliothèque statique

Programming, Linux, Library Creation · lab

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 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

Publicité

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; 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

\************************************************************************/

Publicité

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <factsol.h>

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 :

$ gcc -I. –c fact.c

$ ar -rcs

libfact.a

fact.o

$ gcc -static -I. -L. calcule_factorielle.c –lfact -o calcule_factorielle

Compilation de bibliothèque dynamique

Avec ce deuxième exercice sur la création de bibliothèque, nous allons aborder la compilation de bibliothèque dynamique. Vous pouvez réutiliser les fichiers fact.c, fact.h et calcule_factorielle.c de l'exercice précédent.

Compilez le fichier fact.c pour obtenir un fichier objet fact.o. Cette fois vous ajouter l'option -fPIC sur la ligne de commande, pour que le code engendré soit indépendant de son adresse mémoire.

La création de la bibliothèque libfact.so.1 réclame les options suivants de gcc :

• -shared • -Wl,-soname,libfact.so indiquant le nom de la bibliothèque à l'éditeur

Publicité

de liens

• -o libfact.so.1 pour préciser le nom du fichier de sortie.

fois

Une il nommé libfact.so pointant sur lui.

fichier créé,

le

faut ajouter un

lien symbolique

La compilation de calcule_factorielle.c se fait de manière normale. Toutefois, avant d'exécuter le programme, il faut indiquer au chargeur l'emplacement de la bibliothèque dynamique. Ceci est possible en configurant la variable d'environnement LD_LIBRARY_PATH.

Les fichiers factsol.h, factsol.c et calcule_factorielle.c sont identiques à ceux de l'exercice précédent. La compilation s'effectue ainsi :

$ ls -l *fact* -rw-r--r-- 1 ccb ccb 754 avr 29 09:51 calcule_factorielle_sol.c -rw-r--r-- 1 ccb ccb 431 avr 29 09:51 factsol.c -rw-r--r-- 1 ccb ccb 92 avr 29 09:34 factsol.h $ gcc -I. -fPIC -c factsol.c $ ls -l *fact* -rw-r--r-- 1 ccb ccb 754 avr 29 09:51 calcule_factorielle_sol.c -rw-r--r-- 1 ccb ccb 431 avr 29 09:51 factsol.c -rw-r--r-- 1 ccb ccb 92 avr 29 09:34 factsol.h -rw-r--r-- 1 ccb ccb 727 avr 29 10:42 factsol.o $ gcc -shared -Wl,-soname,libfactsol.so -o libfactsol.so.1 factsol.o $ ls -l libfact* -rwxr-xr-x 1 ccb ccb 4462 avr 29 10:42 libfactsol.so.1 $ ln -sf libfactsol.so.1 libfactsol.so $ ls -l libfact* lrwxr-xr-x 1 ccb ccb 15 avr 29 10:43 libfactsol.so -> libfactsol.so.1 -rwxr-xr-x 1 ccb ccb 4462 avr 29 10:42 libfactsol.so.1 $ gcc -lfactsol -L. -I. calcule_factorielle_sol.c -o calcule_factorielle_sol $ export LD_LIBRARY_PATH=. $ ./calcule_factorielle_sol 5 6 7 5! = 120 6! = 720 7! = 5040 $