Подтвердить что ты не робот

Как я могу получить cmake, чтобы найти свою альтернативную установку boost?

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

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

4b9b3361

Ответ 1

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

Ответ 2

Вы должны взглянуть на FindBoost.cmake script, который обрабатывает обнаружение 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 .

Ответ 3

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

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

Ответ 4

У меня была аналогичная проблема, cmake обнаружение только установленного booster поставщика, но мой кластер локально установленную версию, которую я хотел использовать. RHEL 6

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

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

Ответ 5

Как правило, наиболее распространенной ошибкой является НЕ ОЧИСТКА ВАШЕГО СТРОИТЕЛЬНОГО ДИРЕКТА после добавления новых параметров. У меня установлен 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 buildcmake ../src, он установит Boost из системного пути. Тогда выполнение cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src ничего не изменит.

У ВАС ЕСТЬ ЧИСТИТЬ СВОЙ СТРОИТЕЛЬНЫЙ СПРАВОЧНИК. (cd build && rm -rf *;))

Ответ 6

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

При поиске lib, cmake выглядит сначала в следующих переменных:

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

Если вы объявите файлы boost в одном из env vars, 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"

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

Ответ 7

У меня была аналогичная проблема, и я мог использовать настраиваемые библиотеки boost, добавляя строки bewlow к моему 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})

Ответ 8

Официально говоря 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 \
      -DBOOST_LIBRARYDIR=/path/to/boost-dir/lib \
      -DBOOST_INCLUDEDIR=/path/to/boost-dir/include

Не используйте FindBoost

Мне действительно не нравится CMake. Это лучше, возможно, чем то, что было до этого, но автомат, такой как FindBoost, действительно является только волшебным, когда boost установлен в известном местоположении и не имеет отношения к нескольким версиям или кросс-компиляции. Вы можете отбросить неприятный FindBoost script и просто включить заголовки и библиотеки, которые являются надежными, но тогда вы просто уменьшили значение использования CMake.

Компилировать из источника

Наконец, вы можете уклониться от проблемы так, как я делаю, чтобы загрузить и скомпилировать boost для проекта из источника. Это особенно полезно при кросс-компиляции.

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} )

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

include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
                       ${Boost_LIBRARIES} )

Ответ 9

Я также столкнулся с той же проблемой, но попытки подсказки здесь, к сожалению, не помогли. Единственное, что помогло - загрузить последнюю версию с страницы повышения, скомпилировать и установить ее, как описано здесь: http://piyushparkash.blogspot.de/2012/10/installing-boost-150-in-ubuntu-1210.html

в моем случае я работал с boost 1.53.

Ответ 10

В то время как configure может найти мою установку boost, cmake не смог.

Найдите FindBoost.cmake и найдите LIBRARY_HINTS, чтобы узнать, какие подпакеты он ищет. В моем случае ему нужны библиотеки mpi и graph.

 # Compute component-specific hints.
  set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "")
  if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR
     ${COMPONENT} STREQUAL "graph_parallel")
    foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES})
      if(IS_ABSOLUTE "${lib}")
        get_filename_component(libdir "${lib}" PATH)
        string(REPLACE "\\" "/" libdir "${libdir}")
        list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir})
      endif()
    endforeach()
  endif()

apt-cache search... Я установил пакеты dev с момента создания кода, а пакет dev перетащил все зависимости. Я не уверен, что стандартная boost-установка требует openmpi, но сейчас все в порядке.

sudo apt-get install libboost-mpi-dev libboost-mpi-python-dev 
sudo apt-get install libboost-graph-parallel-dev

Ответ 11

Я провел большую часть своего вечера, пытаясь заставить это работать. Я пробовал все -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 'в моей сборке/каталоге, чтобы явно указать все команды сборки на установку Boost, которую я хотел использовать., который работал.

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