Я пытаюсь настроить проект с помощью CMake, но мне не удается найти библиотеки Boost, даже если они находятся в указанной папке. Я указал Boost_INCLUDE_DIR
, Boost_LIBRARYDIR
и BOOST_ROOT
, но я все равно получаю сообщение об ошибке, что CMake не может найти Boost. Что могло быть причиной такой ошибки?
87
Boost_INCLUDE_DIR
а другие используют флагBoost_INCLUDEDIR
( без подчеркивания ). Вы можетеFindBoost.cmake
path-to-cmake/Modules/FindBoost.cmake
find_package(Boost CONFIG)
Ответы:
Вы уверены, что делаете это правильно? Идея в том, что 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
.источник
${Boost_INCLUDE_DIR}
не так${BOOST_INCLUDE_DIR}
, дело имеет значение.BOOST_INCLUDEDIR
'?Дополнительную помощь можно получить, прочитав
FindBoost.cmake
файл. Он находится в вашем каталоге «Модули».Хорошее начало - это
set(Boost_DEBUG 1)
- это даст много информации о том, где находится boost, что он ищет, и может помочь объяснить, почему он не может его найти.Это также может помочь вам понять,
BOOST_ROOT
правильно ли он улавливает вас .FindBoost.cmake
также иногда возникают проблемы, если точная версия повышения не указана в переменных «Доступные версии». Вы можете узнать об этом больше, прочитавFindBoost.cmake
.Наконец,
FindBoost.cmake
прошлом были некоторые ошибки. Одна вещь, которую вы можете попробовать, - это взять более новую версиюFindBoost.cmake
из последней версии CMake и вставить ее в папку своего проекта рядом сCMakeLists.txt
вами - тогда, даже если у вас есть старая версия boost, она будет использовать новую версиюFindBoost.cmake
которая находится в папка вашего проекта.Удачи.
источник
Я сам некоторое время боролся с этой проблемой. Оказалось, что
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.источник
Вы также можете указать версию Boost, которую вы хотите, чтобы CMake использовал, передавая
-DBOOST_INCLUDEDIR
или-DBOOST_ROOT
указывая на расположение правильных заголовков повышения версии.Пример:
cmake -DBOOST_ROOT=/opt/latestboost
Это также будет полезно, когда в одной системе находится несколько версий повышения.
источник
У меня также была аналогичная проблема, и я обнаружил, что переменные окружения BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR и BOOST_ROOT должны содержать абсолютные пути. HTH!
источник
У меня была такая же проблема при попытке запустить
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
себя на предмет наличия опций и обнаружил следующее:Итак, я запустил в рассматриваемом каталоге следующее:
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
подобрать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++
источник
Если вы создаете собственный буст, не забудьте использовать,
--layout=versioned
иначе поиск конкретной версии библиотеки не удастся.источник
Еще один совет для тех, кто пытается создать CGAL, в частности, со статически связанным Boost. Недостаточно определить
Boost_USE_STATIC_LIBS
; он переопределяется временемBoost_DEBUG
вывода его значения. Здесь нужно установить флажок «Дополнительно» и включитьCGAL_Boost_USE_STATIC_LIBS
.источник
У меня была такая же проблема, и ни одно из вышеперечисленных решений не помогло. Фактически, файл
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
источник
Это также может произойти, если для параметра
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
что вызвало проблему.источник
Может быть
Вам поможет.
источник