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

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

les erreurs indiqué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 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 à le faire. Les seules lignes que j'ai ajoutées à mes fichiers CMake étaient:

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)
84
demandé sur Peter Mortensen 2010-10-10 00:52:00

5 réponses

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.

autant que je me souvienne, il sera installé sur /usr/share/cmake/Modules/ avec d'Autres scripts de recherche pour les bibliothèques communes. Vous pouvez simplement consulter la documentation dans ce fichier pour plus d'informations sur la façon dont il fonctionne.

un exemple sorti 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 aider.

120
répondu MOnsDaR 2018-09-05 00:26:34

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} )
46
répondu Dean Chen 2011-10-31 10:46:46

adapter la réponse de @MOnsDaR pour la syntaxe moderne de CMake avec des cibles importées, ce serait:

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

noter qu'il n'est pas nécessaire de spécifier les répertoires include manuellement, car il est déjà pris en charge par la cible importée Boost::program_options .

11
répondu oLen 2017-05-10 06:50:50

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

maintenant avec cet exemple concret montré qui nous dit que vous voulez Boost options de programme (et encore plus nous a dit que vous êtes sur Ubuntu), vous devez faire deux choses:

  1. installez libboost-program-options-dev pour que vous puissiez faire le lien avec.
  2. dire cmake pour lier à libboost_program_options .

j'utilise surtout des Makefiles donc voici l'utilisation en ligne de commande directe:

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

il ne fait pas beaucoup il semble.

pour CMake, vous devez ajouter boost_program_options à la liste des bibliothèques, et IIRC ceci est fait via SET(liblist boost_program_options) dans votre CMakeLists.txt .

4
répondu Dirk Eddelbuettel 2018-09-05 00:28:16

deux façons, en utilisant le chemin d'installation par défaut du système, habituellement /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 installation locale au lieu d'installation du système, vous pouvez le faire par ceci:

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}
        )

Note la directive 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 êtes intéressé par la façon d'utiliser un Boost local installé, vous pouvez voir cette question Comment puis-je convaincre CMake de trouver mon installation alternative Boost? .

0
répondu Jayhello 2018-09-05 00:44:58