Cmake не находит Boost

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

16 ответов

Решение

Вы уверены, что делаете все правильно? Идея состоит в том, что 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

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

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

Это также может помочь вам определить, правильно ли он подхватывает ваш BOOST_ROOT.

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

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

Удачи.

Для меня эта ошибка была просто потому, что boost не был установлен на ubuntu:

sudo apt install build-essential libboost-system-dev libboost-thread-dev libboost-program-options-dev libboost-test-dev

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

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

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

Пример:

cmake -DBOOST_ROOT=/opt/latestboost

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

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

В моем случае Boost не устанавливался. Я использовал команду ниже на Mac, а затем cmake find_package(Boost) работает как шарм

      brew install Boost

Обратите внимание на верхний регистр "B" в Boost!

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

У меня была такая же проблема при попытке запустить 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

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

Для версии cmake 3.1.0-rc2, чтобы получить повышение 1.57, укажите -D_boost_TEST_VERSIONS = 1.57

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

cmake -D_boost_TEST_VERSIONS = 1.57 -DBoost_DEBUG = ON -DCMAKE_BUILD_TYPE = Отладка -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++

Видеть FindBoost.cmakeпервый. Вы установили правильные переменные, но все они должны быть в верхнем регистре.

Убедитесь, что архитектура библиотеки соответствует конфигурации CMake.

      cmake -A x64 ..

Я предлагаю создать минимальный исполняемый файл, который включает только библиотеку Boost, чтобы проверить, компилируется ли он.

      #include <iostream>
#include <boost/date_time.hpp>
int main() {
    using namespace std;
    using namespace boost::gregorian;
    date today = day_clock::local_day();
    cout << today << endl;
}
      find_package(Boost REQUIRED COMPONENTS
  date_time
)

include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})

add_executable(test_boost "test_boost.cpp")
target_link_libraries(test_boost Boost::date_time)

Начните отладку с проверки Boost_FOUND первый.

      message(STATUS "Boost_FOUND: ${Boost_FOUND}")

Версия должна быть найдена, даже если библиотеки не найдены. ( Boost_VERSION)

Если Boost_LIBRARY_DIRS становится непустым, он должен скомпилироваться.

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

Для тех, кто используетpython3.7изображение докера, это решено:

apt install libboost-system-dev libboost-thread-dev

Это также может произойти, если 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 что вызывало проблему.

У меня была такая же проблема, и ни одно из вышеперечисленных решений не помогло. Собственно, файл 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

Может быть

brew install boost

Вам поможет.

Другие вопросы по тегам