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