Cmake не знаходить Boost


87

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


Деякі версії Boost використовують прапор, Boost_INCLUDE_DIRа інші використовують прапор Boost_INCLUDEDIR( без підкреслення ). Ви можете перевірити правильний для вашої справи, прочитавши FindBoost.cmakeфайл, підpath-to-cmake/Modules/FindBoost.cmake
marcelosalloum

FYI, якщо ви робите посилення за допомогою підтримки 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()

Якщо підсилення не встановлено за замовчуванням і, отже, CMake не може знайти його, ви можете сказати CMake, де шукати підсилення, як це:

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
у мене це не працює ... Він знаходить бібліотеку підвищення, але генерує безліч помилок під час компіляції

1
Не повинно бути ' BOOST_INCLUDEDIR'?
dmedine

2
@IhorKaharlichenko, але BOOST_ROOT має бути BOOST_ROOT. чудово! Дозвольте мені спробувати всі справи, футляр на верблюдах, усі кришки, з підкресленнями, без підкреслення ... <face-palm>
Дак Доджерс

53

Додаткову допомогу можна отримати, прочитавши сам FindBoost.cmakeфайл. Він знаходиться у вашому каталозі "Модулі".

Хорошим початком є set(Boost_DEBUG 1)- це виплюне багато інформації про те, куди шукає поштовх, що він шукає, і може допомогти пояснити, чому він не може його знайти.

Це також може допомогти вам зрозуміти, чи BOOST_ROOTправильно це підхоплює вас .

FindBoost.cmakeтакож іноді має проблеми, якщо точна версія boost не вказана у змінних Доступні версії. Ви можете дізнатись більше про це, прочитавши 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.


6

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

Приклад:

cmake -DBOOST_ROOT=/opt/latestboost

Це також буде корисно, коли в одній системі є кілька версій підсилення.


Дякую, це працювало у мене з Avro build для Windows.
ggurov

5

Я також мав подібну проблему і виявив, що змінні env BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR та BOOST_ROOT повинні містити абсолютні шляхи. HTH!


Так. Виникла та сама проблема через відносний шлях у BOOST_ROOT env. Велике спасибі тобі!
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)

Посилення точно було встановлено, але 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

Для 3.1.0-rc2підбору версії cmake 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.