pkg-config : principe et origine

pkg-config permets d'utiliser un fichier .pc pour spécifier les chemins des fichiers, et les options de compilation pour une bibliothèque donnée.

pkg-config n'a pas pour vocation de remplacer les autotools ou autre outils abscons

Le principe de pkg-config remonte à gtk-config . Comme son nom le laisse entendre, ce dernier faisait la même chose, mais pour gtk.

Sous Windows, un bon moyen de récupérer pkg-config est d'ailleurs de récupérer GKT qui l'intègre, avec d'autres utilitaires ... utiles.

Dans ce dernier cas, le chemin par défaut des fichiers de config sera celui-ci: c:\GTK\lib\pkgconfig\


Avant, après.

Un petit exemple pour les gens qui ne sont pas encore convaincus.

C'est la compilation d'un exemple de Ogre, librairie 3D réputée pour son côté assez huuumm.. complexe.

Vous préférez ...

g++ SkyPlane.cpp -I/n/sources/OgreSDK/include -I/n/sources/OgreSDK/include/Ois -L/n/sources/OgreSDK/lib -lOgreMain -lOIS -I../include


Ou bien

g++ SkyPlane.cpp `pkg-config OGRE --cflags --libs` -lOIS -I../include


Vous aurez sans doute deviné le rôle des flags:

--cflags : envoie les paramètres du compilateur (emplacement des includes, etc..)

--libs : envoie les paramètres pour le linker (emplacement des libs, etc..)


Les variables d'environnement

Différentes variables d'environnement sont à prendre en compte.

Elles sont bien sûr décrites dans la page man, mais les gens les plus pressés auront intêret à connaître celle-ci:

PKG_CONFIG_PATH : permets d'ajouter un ou plusieurs répertoires pour la recherche des fichiers .pc

Pour les autres variables, je vous renvoie à la page man.


Structure d'un fichier .pc

Vous ne devriez pas avoir à intervenir dans un tel fichier, car ceux-ci doivent être fourni avec la bibliothèque, ou à la construction de celle-ci.

Si vous distribuez votre propre bibliothèque, il serait cependant sympathique de le fournir.

Heureusement, la syntaxe est ultra-simple, et se borne à définir les options du compilateur, et les chemins à passer à celui-ci.

Ici, je prends comme exemple libpng.pc

$~ cat /usr/lib/pkgconfig/libpng.pc

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${exec_prefix}/include

Name: libpng12
Description: Loads and saves PNG files
Version: 1.2.16
Libs: -L${libdir} -lpng12 -lz -lm
Cflags: -I${includedir}/libpng12


Juste de la substitution de variables, vraiment rien de sorcier.


Et pour les malheureux sous MSVC

Les otages utilisateurs de MSVC qui ont lu jusque là vont être bien récompensés.

La version de pkg-config livrée avec GTK leur réserve une petite surprise: un flag d'option --msvc-syntax.

Bien sûr, ils m'objecteront qu'il faut commencer par oublier le clickodrome et compiler en ligne de commande.

Sans en arriver à de telles extrémités (je compatis), il doit bien y avoir un moyen de bricoler l'appel avec la GUI de MSCV.