web-dev-qa-db-fra.com

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

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

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

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

Le fichier principal est vraiment simple:

#include <boost/program_options/options_description.hpp>
#include <boost/program_options/option.hpp>
using namespace std;
#include <iostream>

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 sont:

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)
98
Szymon Lipiński

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 de CMake.

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

Un exemple hors 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.

135
MOnsDaR

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} )
47
Dean Chen

Adapter la réponse @MOnsDaR pour une syntaxe CMake moderne avec des cibles importées serait le suivant:

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 manuellement les répertoires d'inclusion, car ils sont déjà pris en charge via la cible importée Boost::program_options.

17
oLen

Quelle bibliothèque Boost? Beaucoup d'entre eux sont des modèles purs et ne nécessitent pas de liaison.

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

  1. Installez libboost-program-options-dev Pour pouvoir créer un lien.
  2. Dites à cmake de faire un lien avec libboost_program_options.

J'utilise principalement les Makefiles, voici donc l'utilisation directe en 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 semble pas beaucoup, semble-t-il.

Pour CMake, vous devez ajouter boost_program_options à la liste des bibliothèques, ce qui est fait par le IIRC via SET(liblist boost_program_options) dans votre CMakeLists.txt.

4

Deux manières, en utilisant 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 si vous choisissez l'installation locale au lieu de l'installation du système, procédez 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 dir ci-dessus /home/xy/boost_install/lib/ est l'endroit où j'installe 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 souhaitez savoir comment utiliser un Boost installé localement, vous pouvez consulter cette question Comment puis-je demander à CMake de trouver mon autre installation Boost?.

3
Jayhello