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)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é boost
s 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 ")
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()
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()