web-dev-qa-db-fra.com

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

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

  • OS X Yosemite
  • CLion 140.2310.6 (Un IDE C/C++ multi-plateformes sur JetBrains utilisant CMake comme système de construction)
  • installé boost via brew install boost dans /usr/local/Cellar/boost/

Mon objectif est maintenant de configurer un projet simple et d’inclure la bibliothèque boost. J'ai défini un seul fichier test.cpp qui ressemble à ceci:

#include <iostream>
#include <boost>

using namespace std;

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

Mon fichier CMakeLists.txt se présente comme suit:

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

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

/Users/nburk/Documents/uni/master/master_thesis/MyProject/test.cpp:2:10: erreur fatale: fichier 'boost' introuvable

make [3]: *** [CMakeFiles/MyProject.dir/test.cpp.o] Erreur 1 make [2]: *** [CMakeFiles/MyProject.dir/all] Erreur 2 make [1]: *** [CMakeFiles/MyProject.dir/rule] Erreur 2 make: *** [MyProject] Erreur 2

J'ai joué avec ajuster les chemins ici et là et aussi en utilisant add_library Et target_link_libraries, Ce qui n'a pas permis de construire le projet avec succès.

Quelqu'un peut-il indiquer dans la bonne direction comment s'assurer de pouvoir inclure la fonctionnalité boosts dans mon projet CLion C++?

Mise à jour: Grâce à la réponse de @ Waxo, j'ai utilisé le code suivant dans mon fichier CMakeLists.txt qui:

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é l'erreur fichier non trouvé -, mais j'obtiens plutôt ce qui suit:

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

fichier STRINGS Le fichier "/usr/local/Cellar/boost/1.57.0/boost/version.hpp" ne peut pas être lu.

Call Stack (l'appel le plus récent en premier): CMakeLists.txt: 11 (find_package)

Des idées 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 ")

47
nburk

Après avoir passé tout l'après-midi sur le sujet, je l'ai résolu moi-même. C'était une erreur plutôt stupide et toutes les allusions de la réponse de @ Waxo étaient vraiment utiles.

La raison pour laquelle cela ne fonctionnait pas pour moi c'est que j'ai écrit #include <boost> dans mon test.cpp - fichier, 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 souhaitez réellement inclure. Vous devez donc plutôt écrire, par exemple. #include <boost/thread.hpp>.

Après tout, une courte séquence d'instructions devrait suffire à inclure correctement boost dans un projet CMake:

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. Pour référence, voici un fichier complet CMakeLists.txt que j'ai utilisé pour le débogage dans un projet en ligne de commande séparé:

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()
63
nburk

Essayez d'utiliser CMake find_package (Boost)

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

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

Modifier:

Regardez aussi celui-ci: Comment lier un programme C++ à 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 à ça:

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()
16
Waxo