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 utilisantCMake
comme système de construction) - installé
boost
viabrew 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 ")
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()
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()