134 votes

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

A 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 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 <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 sont les suivantes :

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)

167voto

MOnsDaR Points 3027

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

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

Un exemple qui me vient à l'esprit :

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 vous aidera.

2 votes

Ajout d'un lien fonctionnel depuis le repo Github de Kitwares. Ajout d'un lien vers la documentation officielle de FindBoost.cmake

1 votes

Pourquoi Boost 1.40 en particulier ? Quand les fonctionnalités de base de la bibliothèque ont-elles cessé de changer ?

8 votes

Pourquoi pas ? C'est juste un exemple... Remplissez ce qui vous convient le mieux

57voto

oLen Points 2291

En adaptant la réponse de @MOnsDaR à 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)

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 par la cible importée Boost::program_options .

55voto

Dean Chen Points 893

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

8 votes

Les link_directories ne sont pas nécessaires car les Boost_LIBRARIES seront des chemins pleinement qualifiés.

0 votes

Dans mon cas, link_directories était nécessaire.

5 votes

Cette réponse n'est pas appropriée pour un nouveau code. oLen La réponse de la Commission devrait être privilégiée

6voto

Jayhello Points 703

Il y a deux façons de procéder, 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 choisir l'installation locale au lieu de l'installation système, vous pouvez le faire de cette manière :

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

Noter 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 la question suivante Comment puis-je faire en sorte que CMake trouve mon installation alternative de Boost ? .

4voto

adem Points 331

Voici ce que j'en pense :

cmake_minimum_required(VERSION 3.15)

project(TryOuts LANGUAGES CXX)

find_package(Boost QUIET REQUIRED COMPONENTS program_options)

if(NOT Boost_FOUND)
    message(FATAL_ERROR "Boost Not found")
endif()

add_executable(helloworld main.cpp)

target_link_libraries(helloworld PUBLIC Boost::program_options)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X