Как включить внешнюю библиотеку (boost) в проект CLion C ++ с помощью CMake?

У меня есть следующие настройки для разработки на C ++:

  • OS X Yosemite
  • CLion 140.2310.6 (кросс-платформенная C / 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, ни один из которых не помог успешно построить проект.

Может ли кто-нибудь указать правильное направление, как убедиться, что я могу включить функциональность boosts в свой проект CLion C ++?

Обновление: благодаря ответу @ 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})

Теперь я пропустил ошибку файл не найден, но вместо этого получаю следующее:

Ошибка CMake в / Applications / 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 ")


person nburk    schedule 27.02.2015    source источник
comment
Не устанавливайте переменные Boost вручную. find_package должно работать из коробки. Если это не так, вы должны передать Boost_DIR команде cmake. Не записывайте системные пути в CMakeLists.txt. Вся суть cmake в том, чтобы быть кроссплатформенным. Конфигурация, специфичная для платформы, требуется редко, и если это способ сделать, это передать параметры конфигурации через командную строку или через cmake-gui.   -  person sbabbi    schedule 27.02.2015
comment
если я его не добавлю, я вернусь к ошибке файл не найден ... однако я уверен, что мне не хватает чего-то еще, и ваш совет кажется мне разумным! Моя основная проблема в том, что я не понимаю некоторых основ того, как на самом деле работает CMake, поэтому я думаю, что мне нужно сесть и сделать домашнее задание, так как я не могу найти тривиальное решение ...   -  person nburk    schedule 27.02.2015
comment
Я заметил, что ваша установка Boost находится по нестандартному пути (/usr/local/cellar). Правильный способ уведомить cmake о необходимости повышения в этом каталоге нужно вызвать cmake с cmake -DBOOST_ROOT=/usr/local/Cellar/boost/1.57.0 ...   -  person sbabbi    schedule 27.02.2015


Ответы (3)


Потратив на эту проблему целый день, я решил ее сам. Это была довольно глупая ошибка, и все подсказки в ответе @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()
person nburk    schedule 27.02.2015
comment
Прекрасный ответ, спасибо! Для пользователей OS X: это также будет работать, если вы установили Boost с помощью Homebrew. - person bmeulmeester; 01.12.2015
comment
Я установил boost с MacPorts, и кажется, что CLion (version 1.2.4) удалось найти его автоматически (без каких-либо изменений в CMakeLists.txt). - person irudyak; 24.02.2016
comment
То же самое и в Window ?? - person Nguyễn Đức Tâm; 05.12.2019

Попробуйте использовать CMake find_package (Boost)

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

Он работает лучше, а CMake предназначен для кросс-компиляции, и предоставление абсолютного пути не подходит для проекта CMake.

Изменить:

Посмотрите и на это: Как связать программу C ++ с Boost с помощью CMake

Потому что вы на самом деле не связываете библиотеку boost со своим исполняемым файлом.

CMake с ускорением обычно выглядит так:

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()
person Waxo    schedule 27.02.2015
comment
Я тоже наткнулся на этот вопрос, и он действительно сработал, так что я больше не получал ошибку файл не найден ... однако теперь я получаю новую ошибку: _1 _... Я обновил свой вопрос, есть идеи? - person nburk; 27.02.2015
comment
Теоретически вам не нужно устанавливать Boost_INCLUDE_DIR и Boost_LIBRARY_DIR, это работа строки find_package (Boost). И не забудьте связующую строку. Если ошибка не устранена, возможно, посмотрите права на файл. - person Waxo; 27.02.2015
comment
Спасибо. Было приятно помочь, у меня были тяжелые времена, когда я запускал CMake, удачи - person Waxo; 27.02.2015

Мне не удалось найти библиотеку boost с помощью find_package () из clion. Итак, мое решение - загрузить последнюю версию Boost со следующего сайта:

https://sourceforge.net/projects/boost/files/boost/

После этого извлеките его и перейдите в эту папку в CMakeList.txt, чтобы включить библиотеку ускорения.

include_directories("/path_to_external_library")

В моем случае я использую linux и поэтому помещаю его в / usr / share /.

include_directories("/usr/share/boost_1_66_0")

person Dracula Oppa    schedule 07.06.2020