
Le cas précédent a montré l'utilisation de bibliothèque installée dans les chemins standards du système de la machine.

Il n'est pas toujours possible d'installer les bibliothèques de manière globale, ni forcément souhaitable, lorsque l'on ne dispose pas des droits d'administration sur la machine. Dans ce cas, il est possible de laisser les fichiers d'en-tête et de librairies dans des répertoires locaux.
Ces répertoires n'étant pas forcément connu par le système de compilation, il va être nécessaire d'indiquer les chemin de ceux-ci.

Considérez l'exemple fourni décrivant:
- un répertoire my_library modélisant un code source d'une bibliothèque externe. Cette bibliothèque ne propose qu'une fonction dont la signature est 
void my_function(int a)

Nous souhaitons compiler cette bibliothèque indépendamment, puis utiliser celle-ci depuis le code source de project/

1- Placez votre ligne de commande dans le répertoire my_library/src/

Lancez make, et observez la compilation puis création d'une bibliothèque statique libmy_function.a


2- Pour l'instant, les fichiers d'en-tête et de bibliothèque sont mélangés dans le code source. L'opération permettant de placer les fichiers dans des répertoires séparés est généralement appelée par la commande install.
Tapez désormais:
make install

et observez la copie des fichiers d'en tête dans le répertoire locale my_library/usr/include/ ainsi que la bibliothèque compilé dans my_library/usr/lib/


3- Placez vous désormais dans le répertoire project/src/. Il s'agit d'un code appelant la fonction de la bibliothèque.

- Ajoutez dans main.cpp, l'appel à la fonction de la bibliothèque avec la ligne suivante:
my_function(3);

- Ajoutez également l'inclusion au fichier d'en tête en début de fichier
#include <my_function.hpp>


4- Lancez make
Observez que la compilation échoue car le fichier my_function.hpp n'est pas trouvé.

> En effet, le fichier n'est pas placé dans le répertoire globale /usr/include, il est nécessaire d'indiquer au compilateur d'ajouter un autre répertoire dans lequel il doit chercher les fichiers d'en tête.
La commande globale d'ajout de répertoire d'en tête est: -I[NOM_REPERTOIRE]


5- Ajoutez désormais: -I../../my_library/usr/include/ dans les options de compilations (CXXFLAGS). Puis lancez à nouveau make.

Observez que la compilation du fichier main.cpp réussit, par contre c'est désormais l'edition des liens échoue. Notez le message d'erreur typique de l'édition des liens caractérisé par l'échec du programme ld indiquant une référence indéfinie vers la fonction souhaitée.

Ajoutez la ligne suivante dans le makefile:
LDFLAGS = -lmy_function

Relancez make, et notez que l'édition des liens ne fonctionne toujours pas car -lmy_function n'est pas trouvé. Similairement au fichiers d'en tête, il est nécessaire d'indiquer le répertoire où se situe la bibliothèque pour l'édition des liens. Cela se réalise par la commande:
-L[NOM_REPERTOIRE]

Modifiez la ligne LDFLAGS par la suivante:
LDFLAGS = -L../../my_library/usr/lib -lmy_function

- Relancez make, observez que l'édition des liens termine et que l'executable est généré.

- Lancez celui-ci, et observez que la fonction est correctement appelée.


Notez qu'étant lié à une bibliothèque statique, la modification du fichier libmy_function.a n'impacte pas l'executable main. Celui-ci devra être recompilé afin de prendre en compte les modifications de la bibliothèque.