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 :
Là en l'occurence, je ne comprends pas grand chose (voir questions suivantes) :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})
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 ...
Partager