Comment inclure une bibliothèque externe (boost) dans le projet C++ de CLion avec CMake?

j'ai la configuration suivante pour le développement C++:

  • OS X Yosemite
  • CLion 140.2310.6 (une plateforme croisée C/C++-IDE par JetBrains utilisant CMake comme système de construction)
  • installé boost via brew install boost dans /usr/local/Cellar/boost/

maintenant, mon but est de mettre en place un projet simple et d'inclure la bibliothèque boost . Je n'ai défini qu'un seul test .rpc fichier qui ressemble à ceci:

#include <iostream>
#include <boost>

using namespace std;

int test() {
    cout << "Hello, World!" << endl;
    return 0; 
}

My CMakeLists.txt fichier ressemble à ceci:

cmake_minimum_required(VERSION 2.8.4) 
project(MyProject)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

include_directories("/usr/local/Cellar/boost/1.57.0/include/boost")

set(SOURCE_FILES main.cpp ./test.cpp)
add_executable(MyProject ${SOURCE_FILES}) 

quand je construis le projet, j'obtiens l'erreur suivante:

/Users/nburk/Documents/uni/master/master_thesis/MyProject / test.rpc:2:10: erreur fatale: le fichier' boost 'n'a pas trouvé

make[3]: * * * [CMakeFiles/MyProject.dir / test.rpc.O] erreur 1 marque[2]: * * * [CMakeFiles/MyProject.dir / all] erreur 2 marque[1]: * * * [CMakeFiles/MyProject.dir/règle] Erreur 2 marque: * * * [MyProject] erreur 2

j'ai joué avec des chemins d'ajustement ici et là et aussi en utilisant add_library et target_link_libraries , aucun d'eux n'a fait le projet construire avec succès.

quelqu'un Peut-il point dans la bonne direction, comment s'assurer que je peux inclure boost s fonctionnalité dans mon CLion projet C++?

mise à Jour: Grâce à la réponse de @Waxo j'ai utilisé le code suivant dans Mes listes de .txt fichier:

set(Boost_INCLUDE_DIR /usr/local/Cellar/boost/1.57.0)
set(Boost_LIBRARY_DIR /usr/local/Cellar/boost/1.57.0/lib)
find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIR})

j'ai maintenant passé le fichier non trouvé - erreur, mais à la place je reçois le suivant:

CMake d'Erreur dans /Applications/CLion EAP.app/Contents/bin/cmake/share/cmake-3.1/Modules / FindBoost.cake: 685 (fichier):

fichier de CHAÎNES de fichier "/usr/local/Cave/boost/1.57.0/boost/version.hpp" ne peut pas être lu.

Pile d'Appel (appel plus récente en premier): CMakeLists.txt: 11 (find_package)

une idée de ce qui me manque encore? La ligne référencée (685) dans FindBoost.cmake est: file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")

38
demandé sur nburk 2015-02-27 12:16:38

2 réponses

après avoir passé tout l'après-midi sur le sujet, je l'ai résolu moi-même. C'était une erreur assez stupide et tous les indices dans la réponse de @Waxo étaient vraiment utiles.

la raison pour laquelle ça ne marchait pas pour moi que j'ai écrit #include <boost> dans mon test .cpp - fichier, ce qui est apparemment tout à fait faux. Au lieu de cela, vous devez vous référer directement aux fichiers d'en-tête que vous voulez réellement inclure, donc vous devriez plutôt écrire par exemple #include <boost/thread.hpp> .

après tout, une courte séquence d'énoncés devrait suffire à inclure avec succès (et indépendamment de la plate-forme) boost dans un CMake projet:

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(BoostTest main.cpp)
target_link_libraries(BoostTest ${Boost_LIBRARIES})

ces lignes font la magie ici. À titre de référence, voici une liste complète des maquettes .txt fichier que j'ai utilisé pour déboguer dans un projet de ligne de commande séparée:

cmake_minimum_required(VERSION 2.8.4)

project(BoostTest)

message(STATUS "start running cmake...")

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED)

if(Boost_FOUND)

    message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
    message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}")
    message(STATUS "Boost_VERSION: ${Boost_VERSION}")

    include_directories(${Boost_INCLUDE_DIRS})

endif()

add_executable(BoostTest main.cpp)

if(Boost_FOUND)

    target_link_libraries(BoostTest ${Boost_LIBRARIES})

endif()
54
répondu nburk 2016-04-05 08:02:37

Essayez d'utiliser CMake find_package(Boost)

src: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html

il fonctionne mieux et CMake est fait pour la compilation croisée et donner un chemin absolu n'est pas bon dans un projet CMake.

Edit:

regardez celui-ci aussi: comment lier le programme C++ avec Boost en utilisant CMake

parce que vous ne liez pas réellement la bibliothèque boost à votre exécutable.

CMake avec boost ressemble généralement à cela:

set(Boost_USE_STATIC_LIBS        ON) # only find static libs
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(Boost 1.57.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  add_executable(foo foo.cc)
  target_link_libraries(foo ${Boost_LIBRARIES})
endif()
15
répondu Waxo 2017-05-23 12:10:30