CMake : recherche de bibliothèques et compréhension des variables
Bonjour.
J'ai un gros problème de compréhension avec CMake (j'ai bien regardé les tutos avant) et notamment en ce qui concerne la définition des variables.
Pour trouver les bibliothèques quand il y a des modules associés c'est assez pratique. Mais pour une bibliothèque qui n'a pas été prévue, j'ai beaucoup plus de mal.
Prenons un exemple : un programme, à la compilation, va nécessiter GMP. L'utilisateur a installé GMP dans un répertoire de son choix, avec un sous répertoire include et un sous répertoire lib. Par exemple :
/perso/gmp/include/gmp.h
/perso/gmp/include/gmpxx.h
/perso/gmp/lib/libgmp.a
/perso/gmp/lib/libgmpxx.a
J'ai tout un tas de questions :
1) Comment faire pour que CMake essaye de les trouver automatiquement ?
2) Comment faire que cela soit réglable au travers du gui cmake pour que l'utilisateur indique où se trouvent les bibliothèques ?
3) Quand on fait à la fin, TARGET_LINK_LIBRARIES(exemple gmp) comment on sait quel nom de librairie on doit mettre. Là en l'occurence j'ai mis gmp, mais pourquoi pas GMP, pourquoi pas Gmp ou encore libgmp ? Comment je devine ce nom ? Cela correspond il au nom du fichier de bibliothèque (par exemple libgmp.a) auquel j'ai retiré le préfixe "lib" et l'extension ".a" ? Si je veux linker un fichier qui s'appelle libessai393lol.a, je mettrais TARGET_LINK_LIBRARIES(exemple essai393lol) ?
4) J'ai posé le même genre de question sur stak overflow. Quelqu'un m'a répondu :
Citation:
CMake is not so hard to understand.
First Step
Use find_package to locate the libary.
find_package(GMP REQUIRED)
Second step
Use include_directories to include the libary header files.
include_directories(${GOBJECT_INCLUDE_DIR})
Third Step
Use target_link_libraries to link your binary against the libary.
add_executable(ExecutableName Main.cpp)
target_link_libraries(ExecutableName ${GOBJECT_LIBRARIES})
Là en l'occurence, je ne comprends pas grand chose (voir questions suivantes) :
5) find_package(GMP REQUIRED) : find_package n'est-il pas réservé à des "routines" pré écrites ? Là encore pourquoi GMP ? Est-ce parce que le fichier s'appelle libgmp.a, je retire lib et .a et je met ce qui reste en majuscules ? Par exemple pour libessai393lol.a, j'aurai mis find_package(ESSAI393LOL REQUIRED) ?
6) Alors ensuite le ${GOBJECT_INCLUDE_DIR} et ${GOBJECT_LIBRARIES}, pour moi, ils sortent de l'espace... Est-ce des noms de variables complètement arbitraires qui seront indiqués par l'utilisateur lorsqu'il lancera Cmake ? Ou sinon comment je les trouve ces noms ? Est-ce que un nom de variable avec le suffixe _INCLUDE_DIR ou _LIBRARIES est interprété par CMake, ou j'aurai pu mettre genre ${GOBJECT_INC_DIR} et ${GOBJECT_LIB} ? Le GOBJECT il vient d'où ?
7) Bon, là en l'occurence la question portait juste sur libgmp et libgmpxx. Admettons maintenant que j'ai un répertoire contenant une vingtaine de librairies. Comment faire pour les inclure/linker toutes ? Il faut que je les traite une par une ?
Ces questions sont très naïves, mais pour l'instant, j'avance dans le brouillard : je me contente de recopier des trucs sans savoir ce qui sera interprété, ce qui sera proposé à l'utilisateur etc...
Merci beaucoup à celui/ceux qui prendront le temps de m'éclairer ;)
EDIT : mon but est de comprendre comment linker simplement une bibliothèque pour laquelle il n'existe pas de module automatique ...