Le Pays de Jershon

Trucs et astuces en informatique

Inclure une bibliothèque externe dans un projet C++ avec cmake


Cmake est une application libre qui permet de gérer la construction d'applications, indépendamment du compiler utilisé. C'est une application très puissante, utilisée dans un grand nombre de projets libres. Cependant, elle est parfois un peu compliquée à configurer.

Récemment, j'ai eu besoin de lier une bibliothèque externe à un projet C++ utilisant cmake. J'ai eu un peu de mal à tout faire fonctionner correctement, du coup j'explique ici ce que j'ai fait pour que cela fonctionne.

La bibliothèque externe est composée de deux éléments importants :

  • Un répertoire content les fichiers d'en-tête (headers). Les fichiers dans ce répertoire portent l'extension .h, .hpp ou encore .tpp ou .txx pour les classes à template. Ce sont les fichiers qui décrivent les signatures des classes, c'est à dire les interfaces de la bibliothèque.

  • Un fichier binaire contenant la bibliothèque compilée. Il porte l'extension .so s'il s'agit d'une bibliothèque dynamique, ou l'extension .a pour une bibliothèque statique.

Cmake a besoin de connaître le chemin vers ces deux éléments. Il faut donc définir deux variables à cet effet dans le fichier CMakeLists.txt :

if(NOT MyLib_INCLUDE_DIRS)
    set(MyLib_INCLUDE_DIRS  "/usr/local/include/MyLib" CACHE PATH "")
endif(NOT MyLib_INCLUDE_DIRS)
if(NOT MyLib_LIBRARY)
    set(MyLib_LIBRARY       "/usr/local/lib/libMyLib.so" CACHE PATH "")
endif(NOT MyLib_LIBRARY)

Ici, je positionne une valeur par défaut pour ces variables, mais il sera sûrement nécessaire de donner les valeurs correctes lors de l'appel à cmake.

L'étape suivante consiste à dire à cmake d'aller chercher les fichiers d'en-tête. Pour cela, le fichier CMakeLists.txt doit contenir la ligne :

include_directories(${MyLib_INCLUDE_DIRS})

Pour finir, il faut expliquer à cmake que l'ont souhaite lier cette bibliothèque à notre application. Le fichier CMakeLists.txt doit donc contenir :

add_executable(MY_APP my_app.cpp )
target_link_libraries(MY_APP ${MyLib_LIBRARY} )

A présent, votre application est prête pour la construction.

Comments


There are no comments yet.

Add a Comment

You can use the Markdown syntax to format your comment.

Comment Atom Feed