Cmake не находит Boost


87

Я пытаюсь настроить проект с помощью CMake, но мне не удается найти библиотеки Boost, даже если они находятся в указанной папке. Я указал Boost_INCLUDE_DIR, Boost_LIBRARYDIRи BOOST_ROOT, но я все равно получаю сообщение об ошибке, что CMake не может найти Boost. Что могло быть причиной такой ошибки?


Некоторые версии Boost используют флаг, Boost_INCLUDE_DIRа другие используют флаг Boost_INCLUDEDIR( без подчеркивания ). Вы можете FindBoost.cmakepath-to-cmake/Modules/FindBoost.cmake
выбрать

К вашему сведению, если вы создаете ускорение с поддержкой CMake, вам следует использоватьfind_package(Boost CONFIG)
Дмитрий Сазонов

Ответы:


105

Вы уверены, что делаете это правильно? Идея в том, что CMake устанавливает BOOST_INCLUDE_DIR, BOOST_LIBRARYDIRпричем BOOST_ROOTавтоматически. Сделайте что-то подобное в CMakeLists.txt:

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

Если boost не установлен в месте по умолчанию и, следовательно, не может быть найден CMake, вы можете указать CMake, где искать boost, например:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

Конечно, эти две линии должны быть , прежде чем в FIND_PACKAGE(Boost)ин CMakeLists.txt.


36
Это ${Boost_INCLUDE_DIR}не так ${BOOST_INCLUDE_DIR}, дело имеет значение.
Игорь Кагарличенко

3
Возможно, это изменилось в более новых версиях cmake, но вот справочные документы: cmake.org/cmake/help/v3.0/module/FindBoost.html
Ник

2
у меня это не работает ... Он находит библиотеку boost, но генерирует

1
Разве это не должно быть ' BOOST_INCLUDEDIR'?
dmedine

2
@IhorKaharlichenko, но BOOST_ROOT должен быть BOOST_ROOT. замечательно ! Позвольте мне попробовать со всеми падежами, верблюжьим регистром, заглавными буквами, с подчеркиванием, без подчеркивания ... <face-palm>
Duck Dodgers

53

Дополнительную помощь можно получить, прочитав FindBoost.cmake файл. Он находится в вашем каталоге «Модули».

Хорошее начало - это set(Boost_DEBUG 1) - это даст много информации о том, где находится boost, что он ищет, и может помочь объяснить, почему он не может его найти.

Это также может помочь вам понять, BOOST_ROOTправильно ли он улавливает вас .

FindBoost.cmakeтакже иногда возникают проблемы, если точная версия повышения не указана в переменных «Доступные версии». Вы можете узнать об этом больше, прочитавFindBoost.cmake .

Наконец, FindBoost.cmake прошлом были некоторые ошибки. Одна вещь, которую вы можете попробовать, - это взять более новую версию FindBoost.cmakeиз последней версии CMake и вставить ее в папку своего проекта рядом с CMakeLists.txtвами - тогда, даже если у вас есть старая версия boost, она будет использовать новую версиюFindBoost.cmake которая находится в папка вашего проекта.

Удачи.


10

Я сам некоторое время боролся с этой проблемой. Оказалось, что cmakeискали файлы библиотеки Boost, используя соглашение об именах Boost, в котором имя библиотеки является функцией версии компилятора, используемой для ее создания. Наши библиотеки Boost были созданы с использованием GCC 4.9.1, и эта версия компилятора фактически присутствовала в нашей системе; впрочем, GCC 4.4.7тоже довелось установить. Как это часто бывает, FindBoost.cmakeсценарий cmake автоматически определял GCC 4.4.7установку вместо GCC 4.9.1той, что искал файлы библиотеки Boost с " gcc44" в именах файлов, а не "gcc49 ".

Простое исправление заключалось в том, чтобы заставить cmake предполагать наличие GCC 4.9, установив Boost_COMPILERзначение " -gcc49" в CMakeLists.txt. С этим изменением я FindBoost.cmakeискал и нашел мои файлы библиотеки Boost.


7

Вы также можете указать версию Boost, которую вы хотите, чтобы CMake использовал, передавая -DBOOST_INCLUDEDIRили -DBOOST_ROOTуказывая на расположение правильных заголовков повышения версии.

Пример:

cmake -DBOOST_ROOT=/opt/latestboost

Это также будет полезно, когда в одной системе находится несколько версий повышения.


Спасибо, у меня это сработало со сборкой Avro для Windows.
ggurov 09

Работал для меня, установив его в инструменте CMake GUI в качестве среды ... Затем добавьте запись, затем BOOST_ROOT, значение C: \ Program Files \ PCL 1.11.1 \ 3rdParty \ Boost (у меня установлен PCL)
Ричард Кин

5

У меня также была аналогичная проблема, и я обнаружил, что переменные окружения BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR и BOOST_ROOT должны содержать абсолютные пути. HTH!


Да. Была такая же проблема из-за относительного пути в окружении BOOST_ROOT. Большое спасибо Вам!
korst1k

2

У меня была такая же проблема при попытке запустить makeпроект после установки Boost версии 1.66.0 на Ubuntu Trusty64. Сообщение об ошибке было похоже (не совсем похоже) на это:

CMake Error at     
/usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message):
Unable to find the requested Boost libraries.
Boost version: 0.0.0
Boost include path: /usr/include
Detected version of Boost is too old.  Requested version was 1.36 (or newer).
Call Stack (most recent call first):
CMakeLists.txt:10 (FIND_PACKAGE)

Boost определенно был установлен, но CMake его не обнаружил. Потратив много времени на то, чтобы возиться с путями и переменными окружения, я в конце концов проверил cmakeсебя на предмет наличия опций и обнаружил следующее:

--check-system-vars        = Find problems with variable usage in system files

Итак, я запустил в рассматриваемом каталоге следующее:

sudo cmake --check-system-vars

который вернулся:

Also check system files when warning about unused and uninitialized variables.
-- Boost version: 1.66.0
-- Found the following Boost libraries:
--   system
--   filesystem
--   thread
--   date_time
--   chrono
--   regex
--   serialization
--   program_options
-- Found Git: /usr/bin/git
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/myproject

и решил проблему.


2

Для CMake версии 3.1.0-rc2подобрать boost 1.57указать-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2по умолчанию, boost<=1.56.0как видно с использованием-DBoost_DEBUG=ON

cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++


2

Если вы создаете собственный буст, не забудьте использовать, --layout=versionedиначе поиск конкретной версии библиотеки не удастся.


1

Еще один совет для тех, кто пытается создать CGAL, в частности, со статически связанным Boost. Недостаточно определить Boost_USE_STATIC_LIBS; он переопределяется временем Boost_DEBUGвывода его значения. Здесь нужно установить флажок «Дополнительно» и включить CGAL_Boost_USE_STATIC_LIBS.


0

У меня была такая же проблема, и ни одно из вышеперечисленных решений не помогло. Фактически, файл include/boost/version.hppне мог быть прочитан (скриптом cmake, запущенным jenkins).

Мне пришлось вручную изменить разрешение библиотеки (boost) (хотя jenkins принадлежит к группе, но это еще одна проблема, связанная с jenkins, которую я не мог понять):

chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library
#chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess

0

Это также может произойти, если для параметра CMAKE_FIND_ROOT_PATHустановлено значение, отличное от BOOST_ROOT. Я столкнулся с той же проблемой, что, несмотря на настройку BOOST_ROOT, я получал ошибку. Но для кросс-компиляции для ARM я использовал Toolchain-android.cmake, в котором у меня (по какой-то причине) было:

set(BOOST_ROOT "/home/.../boost")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")

CMAKE_FIND_ROOT_PATHпохоже, переопределяет, BOOST_ROOTчто вызвало проблему.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.