Come collegare il programma C ++ con Boost utilizzando CMake


109

Come dovrebbe apparire il mio file CMake per collegare il mio programma alla libreria Boost in Ubuntu?

Gli errori visualizzati durante l'esecuzione make:

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

Il file principale è davvero semplice:

#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;
}

Ci sono riuscito. Le uniche righe che ho aggiunto ai miei file CMake sono state:

target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)

Risposte:


150

In CMake puoi usare find_packageper trovare le librerie di cui hai bisogno. Di solito c'è un FindBoost.cmakeinsieme all'installazione di CMake.

Per quanto ricordo, verrà installato /usr/share/cmake/Modules/insieme ad altri script di ricerca per le librerie comuni. Potresti semplicemente controllare la documentazione in quel file per ulteriori informazioni su come funziona.

Un esempio fuori di testa:

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

Spero che questo codice aiuti.


2
Aggiunto un collegamento funzionante dal repository Kitwares Github. Aggiunto anche un collegamento alla documentazione ufficiale su FindBoost.cmake
MOnsDaR

1
Perché Boost 1.40 in particolare? Quando hanno smesso di cambiare le funzionalità di base della libreria?
jgyou

6
Perché no? È solo un esempio ... Inserisci quello che ti si addice meglio
lunedì

5
Un dettaglio importante è posizionarlo target_link_libraries dopo le linee add_executable e find_package , in modo che tutti i componenti collegati siano noti.
Murphy

52

La seguente è la mia configurazione:

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

7
Il link_directories non è richiesto poiché Boost_LIBRARIES sarà percorsi completamente qualificati.
RobertJMaynard

Nel mio caso link_directories era necessario.
mgruber4

25

Adattando la risposta @MOnsDaR per la moderna sintassi CMake con target importati, questo sarebbe:

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

Si noti che non è necessario specificare manualmente le directory di inclusione, poiché è già gestito tramite il target importato Boost::program_options.


Lo svantaggio di questo approccio target è che se la tua versione Boost è più recente della tua versione CMake, probabilmente fallirà. The FindBoost.cmakeoriginariamente li costruisce solo se elenca esplicitamente la tua versione Boost. Ad un certo punto questo avrebbe dovuto essere migliorato, ma sto ancora riscontrando errori con CMake 3.10.2 e Boost 1.66 (le copie più recenti di brew).
Henry Schreiner

4
stackoverflow inizia a fallire perché ci sono così tante risposte obsolete che spesso è difficile trovare la risposta giusta (questa).
Carlo Wood

3

Quale libreria Boost? Molti di loro sono modelli puri e non richiedono collegamenti.

Ora con quell'esempio concreto effettivamente mostrato che ci dice che vuoi le opzioni del programma Boost (e ancora di più ci ha detto che sei su Ubuntu), devi fare due cose:

  1. Installare libboost-program-options-dev modo da poterlo collegare.
  2. cmakedi collegare contro libboost_program_options.

Uso principalmente Makefile, quindi ecco l'uso diretto della riga di comando:

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

Sembra che non faccia molto.

Per CMake, devi aggiungere boost_program_options all'elenco delle librerie e IIRC questo viene fatto tramite SET(liblist boost_program_options)nel tuo file CMakeLists.txt.


11
Il tuo consiglio CMake è sbagliato (vedi la risposta accettata) e il tuo consiglio della riga di comando non è molto utile poiché la domanda riguardava CMake.
Ela782

3

Due modi, utilizzando il percorso di installazione predefinito del sistema, di solito /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}
        )

Se installi Boost in una directory locale o scegli l'installazione locale invece dell'installazione di sistema, puoi farlo in questo modo:

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

Nota che la directory sopra /home/xy/boost_install/lib/è dove installo 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/

Se sei interessato a come utilizzare un Boost installato in locale, puoi vedere questa domanda Come posso convincere CMake a trovare la mia installazione Boost alternativa? .


2

Ecco la mia opinione:

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)

target_link_libraries (helloworld PUBLIC Boost :: program_options) darà un errore CMAKE: - Configurazione di done CMake Error su CMakeLists.txt: 102 (add_executable): Target "DB32" link a target "Boost :: program_options" ma l'obiettivo non è stato trovato . Forse manca una chiamata find_package () per un target IMPORTED o manca un target ALIAS?
munsingh

Ciao, grazie per il feedback. Sembra che CMake non sia in grado di individuare Boost sul tuo sistema. Forse è meglio che crei una nuova build del Boost dalla fonte. Prima di ciò potresti voler provare quanto segue: Trova il pacchetto con find_package(Boost QUIET REQUIRED)e collega al tuo target (DB32):target_link_libraries(DB32 PUBLIC Boost::headers)
adem
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.