Comment lier un programme C ++ avec Boost en utilisant CMake

À quoi devrait ressembler mon fichier CMake pour lier mon programme à la bibliothèque Boost sous Ubuntu?

Les erreurs affichées lors de l’exécution make :

 main.cpp:(.text+0x3b): undefined reference to `boost::program_options::options_description::m_default_line_length' 

Le fichier principal est très simple:

 #include  #include  using namespace std; #include  namespace po = boost::program_options; int main(int argc, char** argv) { po::options_description desc("Allowed options"); desc.add_options() ("help", "produce help message") ; return 0; } 

J’ai réussi à faire ça. Les seules lignes que j’ai ajoutées à mes fichiers CMake étaient:

 target_link_libraries( my_target_file ${Boost_PROGRAM_OPTIONS_LIBRARY} ) 

Dans CMake, vous pouvez utiliser find_package pour trouver les bibliothèques dont vous avez besoin. Il y a généralement un FindBoost.cmake avec votre installation CMake.

Pour autant que je m’en souvienne, il sera installé dans /usr/share/cmake/Modules/ avec d’autres scripts de recherche pour les bibliothèques communes. Vous pouvez simplement consulter la documentation de ce fichier pour plus d’informations sur son fonctionnement.

Un exemple de ma tête:

 FIND_PACKAGE( Boost 1.40 COMPONENTS program_options REQUIRED ) INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} ) ADD_EXECUTABLE( anyExecutable myMain.cpp ) TARGET_LINK_LIBRARIES( anyExecutable LINK_PUBLIC ${Boost_LIBRARIES} ) 

J’espère que ce code aide.

  • Voici la documentation officielle sur FindBoost.cmake .
  • Et le FindBoost.cmake réel (hébergé sur GitHub)

Voici ma configuration:

 cmake_minimum_required(VERSION 2.8) set(Boost_INCLUDE_DIR /usr/local/src/boost_1_46_1) set(Boost_LIBRARY_DIR /usr/local/src/boost_1_46_1/stage/lib) find_package(Boost COMPONENTS system filesystem REQUIRED) include_directories(${Boost_INCLUDE_DIR}) link_directories(${Boost_LIBRARY_DIR}) add_executable(main main.cpp) target_link_libraries( main ${Boost_LIBRARIES} ) 

Adapter la réponse @MOnsDaR pour la syntaxe CMake moderne avec des cibles imscopes, ce serait:

 find_package(Boost 1.40 COMPONENTS program_options REQUIRED) add_executable(anyExecutable myMain.cpp) target_link_libraries(anyExecutable Boost::program_options) 

Notez qu’il n’est pas nécessaire de spécifier les répertoires include manuellement, car ils sont déjà pris en charge par la cible imscope Boost::program_options .

Quelle librairie Boost? Beaucoup d’entre eux sont de purs modèles et ne nécessitent pas de liaison.

Maintenant, avec cet exemple concret qui montre que vous voulez des options de programme Boost (et plus encore que vous êtes sur Ubuntu), vous devez faire deux choses:

  1. Installez libboost-program-options-dev pour pouvoir le lier.
  2. Dites à cmake de cmake lien avec libboost_program_options .

J’utilise principalement les Makefiles, voici donc l’utilisation directe de la ligne de commande:

 $ g++ boost_program_options_ex1.cpp -o bpo_ex1 -lboost_program_options $ ./bpo_ex1 $ ./bpo_ex1 -h $ ./bpo_ex1 --help $ ./bpo_ex1 -help $ 

Cela ne fait pas beaucoup, semble-t-il.

Pour CMake, vous devez append boost_program_options à la liste des bibliothèques et IIRC, via SET(liblist boost_program_options) dans votre CMakeLists.txt .

Deux manières d’utiliser le chemin d’installation par défaut du système, généralement /usr/lib/x86_64-linux-gnu/ :

 find_package(Boost REQUIRED regex date_time system filesystem thread graph) include_directories(${BOOST_INCLUDE_DIRS}) message("boost lib: ${Boost_LIBRARIES}") message("boost inc:${Boost_INCLUDE_DIR}") add_executable(use_boost use_boost.cpp) target_link_libraries(use_boost ${Boost_LIBRARIES} ) 

Si vous installez Boost dans un répertoire local ou choisissez l’installation locale au lieu de l’installation du système, vous pouvez le faire en procédant comme suit:

 set( BOOST_ROOT "/home/xy/boost_install/lib/" CACHE PATH "Boost library path" ) set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" ) find_package(Boost REQUIRED regex date_time system filesystem thread graph) include_directories(${BOOST_INCLUDE_DIRS}) message("boost lib: ${Boost_LIBRARIES}, inc:${Boost_INCLUDE_DIR}") add_executable(use_boost use_boost.cpp) target_link_libraries(use_boost ${Boost_LIBRARIES} ) 

Notez le /home/xy/boost_install/lib/ ci-dessus /home/xy/boost_install/lib//home/xy/boost_install/lib/ Boost:

 xy@xy:~/boost_install/lib$ ll -th total 16K drwxrwxr-x 2 xy xy 4.0K May 28 19:23 lib/ drwxrwxr-x 3 xy xy 4.0K May 28 19:22 include/ xy@xy:~/boost_install/lib$ ll -th lib/ total 57M drwxrwxr-x 2 xy xy 4.0K May 28 19:23 ./ -rw-rw-r-- 1 xy xy 2.3M May 28 19:23 libboost_test_exec_monitor.a -rw-rw-r-- 1 xy xy 2.2M May 28 19:23 libboost_unit_test_framework.a ....... xy@xy:~/boost_install/lib$ ll -th include/ total 20K drwxrwxr-x 110 xy xy 12K May 28 19:22 boost/ 

Si vous êtes intéressé par la manière d’utiliser un Boost installé en local, vous pouvez voir cette question. Comment puis-je faire en sorte que CMake trouve mon autre installation Boost? .