Подтвердить что ты не робот

Как включить внешнюю библиотеку (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 ")

4b9b3361

Ответ 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()