2010-10-09 6 views
74

A quoi devrait ressembler mon fichier cmake pour lier mon programme avec la bibliothèque boost sous Ubuntu?Comment lier le programme C++ avec Boost en utilisant CMake

Les erreurs montrent 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 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é à mes fichiers cmake étaient:

target_link_libraries(
my_target_file 
${Boost_PROGRAM_OPTIONS_LIBRARY} 
) 

Répondre

111

Dans CMake, vous pouvez utiliser find_package pour rechercher les bibliothèques dont vous avez besoin. Il y a généralement un FindBoost.cmake avec votre installation CMake. Pour autant que je me souvienne, il sera installé à /usr/share/cmake/Modules/ avec d'autres find-scripts pour les bibliothèques communes. Vous pouvez simplement vérifier la documentation dans ce fichier pour plus d'informations sur comment cela fonctionne.

Je ne suis pas au travail maintenant, donc je pouvais donner 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}) 

Hope this code permet.

+1

Ajout d'un lien de travail à partir du repo Kitwares Github. Aussi ajouté un lien vers la documentation officielle sur FindBoost.cmake – MOnsDaR

+1

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

+4

Parce que pourquoi pas? C'est juste un exemple ... Remplissez ce qui vous convient le mieux – MOnsDaR

5

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

Modifier Maintenant que réellement montré exemple concret qui nous dit que vous voulez Boostez les options du programme (et plus encore nous a dit que vous êtes sur Ubuntu), vous devez faire deux choses:

  1. installer libboost-program-options-dev de sorte que vous pouvez lier contre
  2. dire cmake pour lier contre libboost_program_options

J'utilise surtout Makefile donc voici la Commande- directe utilisation en ligne:

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

Ne fait pas beaucoup, il semble. Pour CMake, vous devez ajouter boost_program_options à la liste des bibliothèques, IIRC ceci est fait via SET(liblist boost_program_options) dans votre CMakeLists.txt.

+10

Votre conseil CMake est erroné (voir la réponse acceptée), et votre conseil en ligne de commande n'est pas très utile car la question portait sur CMake. – Ela782

43

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

Les link_directories ne sont pas requis car Boost_LIBRARIES sera des chemins complets. – RobertJMaynard

5

Adaptation réponse @MOnsDaR pour la syntaxe moderne 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 il est déjà pris en charge via le tar importé obtenez Boost::program_options.

+0

L'inconvénient de cette approche cible est que si votre version Boost est plus récente que votre version CMake, cela échouera probablement. 'Le FindBoost.cmake' ne les construit à l'origine que s'il répertorie explicitement votre version de Boost. À un moment donné, c'était censé être amélioré, mais je vois encore des échecs avec CMake 3.10.2 et Boost 1.66 (les plus récents exemplaires de brew). –

Questions connexes