Я пытаюсь настроить проект с помощью CMake, но он не может найти библиотеки Boost, даже если они находятся в указанной папке. Я указал Boost_INCLUDE_DIR
, Boost_LIBRARYDIR
и BOOST_ROOT
, но я все еще получаю сообщение о том, что CMake не может найти Boost. В чем может быть причина такой ошибки?
Ответ 1
Вы уверены, что делаете все правильно? Идея состоит в том, что 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, где искать повышение, следующим образом:
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
.
Ответ 2
Дополнительную помощь можно получить, прочитав сам файл FindBoost.cmake
. Он находится в вашем каталоге "Модули".
Хорошее начало - set(Boost_DEBUG 1)
- это даст много информации о том, где находится повышение, что он ищет, и может помочь объяснить, почему он не может его найти.
Это также может помочь вам определить, правильно ли он подхватывает ваш BOOST_ROOT
.
FindBoost.cmake
также иногда имеет проблемы, если точная версия boost не указана в переменных Available Versions. Вы можете узнать больше об этом, прочитав FindBoost.cmake
.
Наконец, у FindBoost.cmake
были некоторые ошибки в прошлом. Одна вещь, которую вы можете попробовать, это взять новую версию FindBoost.cmake
из последней версии CMake и вставить ее в папку вашего проекта вместе с CMakeLists.txt
- тогда даже если у вас есть старая версия boost, она будет использовать новая версия FindBoost.cmake
, которая находится в папке вашего проекта.
Удачи.
Ответ 3
Я боролся с этой проблемой какое-то время. Оказалось, что cmake
ищет файлы библиотеки Boost с использованием соглашения об именах Boost, в котором имя библиотеки является функцией версии компилятора, используемой для ее создания. Наши библиотеки Boost были построены с использованием GCC 4.9.1
, и эта версия компилятора фактически присутствовала в нашей системе; однако установка GCC 4.4.7
также была установлена. Как это бывает, cmake FindBoost.cmake
script автоматически обнаруживал установку GCC 4.4.7
вместо GCC 4.9.1
one, и поэтому искал файлы библиотеки Boost с "gcc44
" в именах файлов, а не "gcc49
".
Простым решением было заставить cmake предположить, что GCC 4.9 присутствовал, установив Boost_COMPILER
в "-gcc49
" в CMakeLists.txt
. С этим изменением FindBoost.cmake
искал и нашел мои файлы библиотеки Boost.
Ответ 4
Вы также можете указать версию Boost, которую вы хотели бы использовать в CMake, передав -DBOOST_INCLUDEDIR
или -DBOOST_ROOT
, указывая на расположение правильных заголовков повышения версии
.Пример:
cmake -DBOOST_ROOT=/opt/latestboost
Это также будет полезно, когда несколько буст-версий находятся в одной системе.
Ответ 5
Если вы создаете собственный импульс, не забудьте использовать -layout = versioned, иначе поиск определенной версии библиотеки завершится неудачно
Ответ 6
У меня также была аналогичная проблема, и обнаружил, что переменные BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR и BOOST_ROOT должны содержать абсолютные пути. НТН!
Ответ 7
Для cmake версии 3.1.0-rc2 для подбора boost 1.57 укажите -D_boost_TEST_VERSIONS = 1.57
cmake версии 3.1.0-rc2 по умолчанию для повышения <= 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++
Ответ 8
У меня была такая же проблема при попытке запустить 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
и решил проблему.
Ответ 9
Еще один совет для тех, кто пытается построить CGAL в частности, со статически связанным Boost. Недостаточно определить Boost_USE_STATIC_LIBS
; он становится переопределенным к моменту времени Boost_DEBUG
выводит его значение. Здесь нужно проверить флажок "Дополнительно" и включить CGAL_Boost_USE_STATIC_LIBS
.
Ответ 10
apt установить libboost-all-dev
Я нашел это здесь: