Compilation d'une bibliothèque statique

Au lieu de créer un exécutable à partir des objets, il faut créer l'archive lib.a. Le programme qui mène à bien cette opération est l'utilitaire Unix ar.

make connaît cette opération. Il faut juste lui indiquer quels objets l'archive doit contenir :

lib....a: lib....a(liste des objets)

(Analogue à la ligne de dépendance d'un exécutable.)

Nota bene : il n'y a pas d'édition de liens lors de la compilation d'une bibliothèque. La variable LDLIBS n'a donc pas à être définie.

Mode déterministe ou non de ar

Selon le système de votre machine, il est possible que ar fonctionne par défaut en mode déterministe : il re-crée la bibliothèque à chaque invocation, même si les objets n'ont pas changé.

Si l'on veut éviter ce comportement, on peut passer une option à ar. make reconnaît la variable ARFLAGS. Sa valeur par défaut est :

ARFLAGS = rv

Cf. base de données de make.

ARFLAGS = rvU

demande à ar de passer en mode non déterministe.

Bibliothèque statique versus bibliothèque dynamique

À l'édition de liens d'un exécutable avec une bibliothèque statique, le code de la bibliothèque est copié dans le fichier exécutable, qui est donc auto-suffisant.

Il est aussi possible de créer et faire l'édition de liens avec une bibliothèque "dynamique", ou encore "partagée".

  • Le code de la bibliothèque n'est pas dans l'exécutable.

  • Le code de la bibliothéque est chargé au moment de l'exécution.

  • Le suffixe est .so au lieu de .a.
  • L'outil qui crée la bibliothèque dynamique n'est pas ar comme pour une bibliothèque statique, c'est le compilateur.

Les bibliothèques installées par votre système sont souvent dynamiques : économie de place ; la mise à jour ne nécessite pas de recompilation du code utilisateur.

Pour vos propres bibliothèques, compilez plutôt des bibliothèques statiques. Intérêt pour la reproductibilité.