Как включить внешнюю библиотеку (boost) в проект CLion С++ с помощью CMake?
У меня есть следующая настройка для разработки на С++:
-
OS X Yosemite
-
CLion 140.2310.6
(межплатформенная C/С++ - IDE с помощью JetBrains с использованием CMake
в качестве системы сборки)
- установлен
boost
через brew install boost
в /usr/local/Cellar/boost/
Теперь моя цель - установить простой проект и включить библиотеку boost
. Я определил только один файл test.cpp, который выглядит следующим образом:
#include <iostream>
#include <boost>
using namespace std;
int test() {
cout << "Hello, World!" << endl;
return 0;
}
Мой файл CMakeLists.txt выглядит следующим образом:
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})
Когда я создаю проект, я получаю следующую ошибку:
/Users/nburk/Documents/uni/master/master_thesis/MyProject/test.cpp:2:10: фатальная ошибка: файл "boost" не найден
make [3]: *** [CMakeFiles/MyProject.dir/test.cpp.o] Ошибка 1 make [2]: *** [CMakeFiles/MyProject.dir/all] Ошибка 2 make [1]: *** [CMakeFiles/MyProject.dir/rule] Ошибка 2 make: *** [MyProject] Ошибка 2
Я играл с настройками путей здесь и там, а также используя add_library
и target_link_libraries
, ни одна из которых не сделала проект успешной.
Может ли кто-нибудь указать в правильном направлении, как убедиться, что я могу включить boost
в мой проект CLion С++?
Update:
Благодаря ответу @Waxo я использовал следующий код в файле CMakeLists.txt, который:
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})
Теперь я прошел мимо файла не найденного -error, но вместо этого получаю следующее:
Ошибка CMake в/Приложения/CLion EAP.app/Contents/bin/cmake/share/cmake-3.1/Modules/FindBoost.cmake:685 (файл):
файл STRINGS "/usr/local/Cellar/boost/1.57.0/boost/version.hpp" не может быть прочитан.
Стек вызовов (последний вызов сначала): CMakeLists.txt: 11 (Find_package)
Любые идеи, что я до сих пор не хватает? Выделенная линия (685) в FindBoost.cmake:
file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")
Ответы
Ответ 1
Проведя весь день по этому вопросу, я решил это сам. Это была довольно глупая ошибка, и все подсказки в ответе @Waxo были действительно полезны.
Причина, по которой это не работало для меня, я написал #include <boost>
в моем файле test.cpp, что, по-видимому, просто неверно. Вместо этого вам нужно обратиться непосредственно к файлам заголовков, которые вы действительно хотите включить, поэтому вы должны скорее написать, например. #include <boost/thread.hpp>
.
В конце концов, короткая последовательность операторов должна быть достаточной для успешного (и независимо от платформы) включать boost
в проект 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})
Эти линии делают магию здесь. Для справки, вот полный файл CMakeLists.txt, который я использовал для отладки в отдельном проекте командной строки:
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()
Ответ 2
Попробуйте использовать CMake find_package (Boost)
src: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html
Это работает лучше, и CMake сделан для кросс-компиляции, и предоставление абсолютного пути не очень хорошо в проекте CMake.
Изменить:
Посмотрите на это тоже: Как связать программу на С++ с Boost с помощью CMake
Потому что вы фактически не связываете библиотеку boost с вашим исполняемым файлом.
CMake с boost обычно выглядит так:
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()