Nous avons déjà mentionné la bibliothèque standard du C.
Le langage C en soi ne fait pas grand-chose; tout ce qui
est utile se trouve dans des fonctions externes. Celles-ci sont groupées
en bibliothèques. La bibliothèque standard du C est le fichier
/lib/libc.so.6. Pour afficher toutes les
fonctions de cette bibliothèque, lancez:
nm /lib/libc.so.6
nm /lib/libc.so.6 | grep ' T ' | cut -f3 -d' ' | grep -v '^_' | sort -u \ | less |
La création de sa propre bibliothèque est simple. Supposons que nous
ayons deux fichiers contenant plusieurs fonctions que nous souhaitons
compiler pour les placer dans une bibliothèque. Les fichiers s'appellent
simple_math_sqrt.c et simple_math_pow.c:
#include <stdlib.h>
#include <stdio.h> static int abs_error (int a, int b) { if (a < b) { return a - b; return b - a; } int simple_math_isqrt (int x) { int result; if (x < 0) { fprintf (stderr, "simple_math_sqrt: taking the sqrt of a negative number\n"); abort (); } result = 2; while (abs_error (result * result, x) > 1) { result = (x / result + result) / 2; } return result; } |
Et pour simple_math_pow.c, nous avons:
#include <stdlib.h>
#include <stdio.h> int simple_math_ipow (int x, int y) { int result; if (x == 1 || y == 0)
return 1;
|
Nous pouvons à présent compiler le code de cette manière:
gcc -Wall -c simple_math_sqrt.c
gcc -Wall -c simple_math_pow.c |
Maintenant, il faut archiver ces fichiers dans la bibliothèque.
A cette fin, on fait usage de la commande ar
(précurseur de tar):
ar r libsimple_math.a simple_math.sqrt.o
simple_math_pow.o
ranlib libsimple_math.a |
La bibliothèque est maintenant utilisable. Créons un fichier appelé
mon_test.c:
#include <stdlib.h>
#include <stdio.h> int main (int argc, char *argv[]) { printf ("%d\n", simple_math_ipow (4, 3)); printf ("%d\n", simple_math_isqrt (50)); return 0; } |
gcc -Wall -c mon_test.c
gcc -L. -o mon_test mon_test.o -l simple_math |
Notons encore qu'il arrive souvent que de nombreuses bibliothèques statiques soient liées à un même programme. Ici, l'ordre est important: la bibliothèque ayant le moins de dépendances devra être citée en dernier ou alors, vous obtiendrez des erreurs de référencement de symboles (symbol referencing errors).
Nous pouvons aussi créer un fichier d'en-tête simple_math.h
pour tirer parti de la bibliothèque:
/* calculates the integer
square root, aborts on error */
int simple_math_isqrt (int x); /* calculates the integer power, aborts on error */ int simple_math_ipow (int x, int y); |
#include <stdlib.h>
#include <stdio.h> #include "simple_math.h" |