Как я могу заставить CMake найти мою альтернативную установку Boost? - PullRequest
48 голосов
/ 10 июня 2010

Я установил самую последнюю версию Boost в /usr/local (с включениями в /usr/local/include/boost и библиотеками в /usr/local/lib/boost) и сейчас пытаюсь установить Wt из исходного кода, но CMake (версия 2.6) не может кажется, найти установку Boost. Он пытается дать полезные советы по настройке BOOST_DIR и Boost_LIBRARYDIR, но я не смог заставить его работать, настроив эти переменные.

Самое последнее сообщение об ошибке, которое я получаю, заключается в том, что он не может найти библиотеки, но, похоже, указывает, что он использует «/ usr / local / include» для пути включения, что неверно (и Я не могу исправить это). Есть ли решение для этого на макушке, или мне нужно покопаться в CMake, чтобы понять это?

Ответы [ 12 ]

37 голосов
/ 10 июня 2010

Вы должны взглянуть на скрипт FindBoost.cmake, который обрабатывает обнаружение Boost и настраивает все переменные Boost.Обычно он находится в /usr/share/cmake-2.6/Modules/.В нем вы найдете документацию.Например:

# These last three variables are available also as environment variables:
#
#   BOOST_ROOT or BOOSTROOT      The preferred installation prefix for searching for
#                                Boost.  Set this if the module has problems finding
#                                the proper Boost installation.
#

В отличие от BOOST_ROOT, переменные, на которые вы ссылаетесь, на самом деле являются переменными, которые устанавливаются модулем FindBoost.Обратите внимание, что вам не нужно (и, вероятно, также не хотите) редактировать конфигурацию вашего проекта CMake для установки BOOST_ROOT.Вместо этого вам следует использовать переменную окружения, например, вызвать

# BOOST_ROOT=/usr/local/... ccmake .

35 голосов
/ 11 июня 2013

Я наконец смог получить то, что хотел с

cmake -DCMAKE_INSTALL_PREFIX=$TARGET \
    -DBoost_NO_BOOST_CMAKE=TRUE \
    -DBoost_NO_SYSTEM_PATHS=TRUE \
    -DBOOST_ROOT:PATHNAME=$TARGET \
    -DBoost_LIBRARY_DIRS:FILEPATH=${TARGET}/lib
17 голосов
/ 12 октября 2016

короткая версия

Вам нужно только BOOST_ROOT, но вы захотите отключить поиск в системе локального Boost, если у вас несколько установок или кросс-компиляция для iOS или Android. В этом случае add Boost_NO_SYSTEM_PATHS имеет значение false.

set( BOOST_ROOT "" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )

Обычно это передается в командной строке CMake с использованием синтаксиса -D<VAR>=value.

Более длинная версия

Официально на странице FindBoost говорится, что эти переменные должны использоваться для «подсказки» местоположения Boost.

Этот модуль считывает подсказки о местах поиска из переменных:

BOOST_ROOT             - Preferred installation prefix
 (or BOOSTROOT)
BOOST_INCLUDEDIR       - Preferred include directory e.g. <prefix>/include
BOOST_LIBRARYDIR       - Preferred library directory e.g. <prefix>/lib
Boost_NO_SYSTEM_PATHS  - Set to ON to disable searching in locations not
                         specified by these hint variables. Default is OFF.
Boost_ADDITIONAL_VERSIONS
                       - List of Boost versions not known to this module
                         (Boost install locations may contain the version)

Это делает теоретически правильное заклинание:

cmake -DBoost_NO_SYSTEM_PATHS=TRUE \
      -DBOOST_ROOT=/path/to/boost-dir

При компиляции из источника

include( ExternalProject )

set( boost_URL "http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2" )
set( boost_SHA1 "9f1dd4fa364a3e3156a77dc17aa562ef06404ff6" )
set( boost_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/third_party/boost )
set( boost_INCLUDE_DIR ${boost_INSTALL}/include )
set( boost_LIB_DIR ${boost_INSTALL}/lib )

ExternalProject_Add( boost
        PREFIX boost
        URL ${boost_URL}
        URL_HASH SHA1=${boost_SHA1}
        BUILD_IN_SOURCE 1
        CONFIGURE_COMMAND
        ./bootstrap.sh
        --with-libraries=filesystem
        --with-libraries=system
        --with-libraries=date_time
        --prefix=<INSTALL_DIR>
        BUILD_COMMAND
        ./b2 install link=static variant=release threading=multi runtime-link=static
        INSTALL_COMMAND ""
        INSTALL_DIR ${boost_INSTALL} )

set( Boost_LIBRARIES
        ${boost_LIB_DIR}/libboost_filesystem.a
        ${boost_LIB_DIR}/libboost_system.a
        ${boost_LIB_DIR}/libboost_date_time.a )
message( STATUS "Boost static libs: " ${Boost_LIBRARIES} )

Затем, когда вы вызываете этот скрипт, вам нужно будет включить скрипт boost.cmake (мой находится в подкаталоге), включить заголовки, указать зависимость и связать библиотеки.

include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
                       ${Boost_LIBRARIES} )
13 голосов
/ 28 июня 2013

Обычно самая распространенная ошибка - не очищает каталог сборки после добавления новых опций.У меня установлен Boost из системного менеджера пакетов.Его версия 1.49.

Я также скачал Boost 1.53 и «установил» его под $HOME/installs.

Единственное, что мне нужно было сделать в моем проекте, было (я держу источникиmy_project_directory/src):

cd my_project_directory
mkdir build
cd build
cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src

И все.Ta bum tss.

Но если бы я сделал после cd build -> cmake ../src, он установил бы Boost из системного пути.Тогда выполнение cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src ничего не изменит.

Вы должны очистить каталог сборки (cd build && rm -rf *;))

12 голосов
/ 03 ноября 2012

У меня была похожая проблема: CMake нашел только Boost, установленный поставщиком, но у моего кластера была локально установленная версия, и именно это I хотел использовать.Red Hat Linux 6.

В любом случае, все вещи BOOSTROOT, BOOST_ROOT и Boost_DIR выглядят раздраженными, если не установить Boost_NO_BOOST_CMAKE (например, добавить в строку cmd -DBoost_NO_BOOST_CMAKE=TRUE).

(Я признаю полезность CMake для мультиплатформенности, но я все еще могу его ненавидеть.)

11 голосов
/ 13 декабря 2012

Существует универсальный метод указания направления CMake о том, где искать библиотеки.

При поиске библиотеки CMake сначала просматривает следующие переменные:

  • CMAKE_LIBRARY_PATHи LD_LIBRARY_PATH для библиотек
  • CMAKE_INCLUDE_PATH и INCLUDE_PATH для включений

Если вы объявите свои файлы Boost в одной из переменных среды, CMake найдет ее.Пример:

export CMAKE_LIBRARY_PATH="/stuff/lib.boost.1.52/lib:$CMAKE_LIBRARY_PATH"
export CMAKE_INCLUDE_PATH="/stuff/lib.boost.1.52/include:$CMAKE_INCLUDE_PATH"

Если это слишком громоздко, вы также можете использовать хороший инструмент для установки, который я написал, который сделает все за вас: Менеджер версий C ++

9 голосов
/ 26 января 2015

У меня была похожая проблема, и я мог использовать настраиваемые библиотеки Boost, добавив следующие строки в мой CMakeLists.txt файл:

set(Boost_NO_SYSTEM_PATHS TRUE)
if (Boost_NO_SYSTEM_PATHS)
  set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
  set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
  set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
endif (Boost_NO_SYSTEM_PATHS)
find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
include_directories(${BOOST_INCLUDE_DIRS})
3 голосов
/ 12 июня 2010

Покопавшись в CMake и поэкспериментировав, я решил, что CMake недоволен тем, что все мои библиотеки Boost содержались в /usr/local/lib/boost, а не /usr/local/lib.Как только я софт-связал их обратно, сборка сработала.

1 голос
/ 12 февраля 2017

Я провел большую часть вечера, пытаясь заставить это работать. Я перепробовал все -DBOOST_ * & c. директивы с CMake, но он продолжал связываться с моими системными библиотеками Boost, даже после многократной очистки и повторной настройки моей области сборки.

В конце я изменил сгенерированный Makefile и аннулировал цель cmake_check_build_system, чтобы ничего не делать (например, «echo» »), чтобы она не перезаписывала мои изменения при запуске make, а затем сделал« grep -rl »lboost_python "* | xargs sed -i "s: -lboost_python: -L / opt / sw / gcc5 / usr / lib / -lboost_python: g 'в моем каталоге build /, чтобы явно указать все команды сборки для установки Boost, которую я хотел использовать. Наконец , это сработало.

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

1 голос
/ 23 мая 2013

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

Единственное, что помогло, это загрузить последнюю версию со страницы Boost, скомпилировать и установить ее, как описанов Установка Boost 1.50 в Ubuntu 12.10 .

В моем случае я работал с Boost 1.53.

...