70

我已经安装了最新版本的 Boost in /usr/local(包含 in/usr/local/include/boost和库/usr/local/lib/boost),现在我正在尝试从源代码安装 Wt,但 CMake(版本 2.6)似乎找不到 Boost 安装。它试图提供有关设置 BOOST_DIR 和 Boost_LIBRARYDIR 的有用建议,但我无法通过调整这些变量来使其工作。

我得到的最新错误消息是它找不到库,但它似乎表明它正在使用“/usr/local/include”作为包含路径,这是不正确的(我可以' t似乎修复它)。是否有解决方案可以解决这个问题,还是我需要在 CMake 中四处寻找才能解决?

4

15 回答 15

48

您应该看一下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 .

于 2010-06-10T16:45:45.090 回答
41

我终于能够得到我想要的

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
于 2013-06-11T17:04:29.193 回答
27

短版

您只需要BOOST_ROOT,但如果您有多个安装或针对 iOS 或 Android 的交叉编译,您将希望禁用在系统中搜索本地 Boost。在这种情况下,addBoost_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 脚本(我的位于 a 子目录中)、包含标题、指示依赖项并链接库。

include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
                       ${Boost_LIBRARIES} )
于 2016-10-12T13:35:01.043 回答
19

我有一个类似的问题,CMake 仅找到供应商安装的 Boost,但我的集群有一个本地安装的版本,这是希望它使用的版本。红帽 Linux 6。

无论如何,除非还设置(例如添加到 cmd 行),否则看起来所有的BOOSTROOT,BOOST_ROOTBoost_DIR东西都会生气。Boost_NO_BOOST_CMAKE-DBoost_NO_BOOST_CMAKE=TRUE

(我会承认 CMake 对多平台的用处,但我仍然讨厌它。)

于 2012-11-02T23:02:40.123 回答
15

通常,最常见的错误是在添加新选项后没有清理构建目录。我从系统数据包管理器安装了 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

就是这样。呸呸呸。

但是,如果我在cd build->之后cmake ../src进行设置,它将从系统路径设置 Boost。然后做cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src不会改变什么。

你必须清理你的构建目录cd build && rm -rf *;))

于 2013-06-28T06:25:18.247 回答
15

我有一个类似的问题,我可以通过在我的CMakeLists.txt文件中添加以下行来使用自定义的 Boost 库:

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})
于 2015-01-26T18:32:36.947 回答
12

有一种通用方法可以为 CMake 提供有关在何处查找库的指示。

在查找库时,CMake 首先查找以下变量:

  • CMAKE_LIBRARY_PATHLD_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++ 版本管理器

于 2012-12-13T14:46:28.333 回答
3

在 CMake 中进行挖掘和试验之后,我确定 CMake 对我所有的 Boost 库都包含在/usr/local/lib/boost而不是/usr/local/lib. 一旦我将它们软链接回来,构建工作。

于 2010-06-12T12:48:11.377 回答
2

我花了我晚上的大部分时间试图让这个工作。我尝试了所有的 -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 安装。最后,那行得通。

我承认这是一个丑陋的杂物,但我只是把它放在这里是为了那些遇到同一堵砖墙,只想解决它并完成工作的人的利益。

于 2017-02-12T20:36:29.843 回答
1

我也遇到了同样的问题,但不幸的是,尝试这里的提示并没有帮助。

唯一有帮助的是从 Boost 页面下载最新版本,按照在 Ubuntu 12.10 上安装 Boost 1.50中所述进行编译和安装。

就我而言,我使用的是 Boost 1.53。

于 2013-05-23T10:59:31.813 回答
1

在 CMake 中,您可以将以下内容添加到您的CMakelists:

# install boost by apt-get method
include_directories(BEFORE SYSTEM "/usr/include") 

#  or install by building from src
# include_directories(BEFORE SYSTEM "/usr/local/include") 

这种方法节省了我几个月的时间。你可以试试。顺便说一句,作为临时解决方案,您可以重命名您不希望找到的目录,如下所示:

sudo mv /usr/local/include/boost /usr/local/include/boost_bak

希望它能帮助像我这样陷入困境的人。

于 2020-06-11T04:07:27.260 回答
0

我只是添加了环境变量 Boost_INCLUDE_DIR 或将其添加到 cmake 命令 -DBoost_INCLUDE_DIR 并指向包含文件夹。

于 2021-01-19T11:31:34.513 回答
0

我在安装了两个版本的 Boost 的 Linux 服务器上遇到了类似的问题。一个是预编译的 1.53.0 版本,在 2018 年算旧版本;它在/usr/include/usr/lib64。我要使用的版本是 1.67.0,因为我正在安装的另一个 C++ 库需要 1.65.1 的最低版本;它在/opt/boost,其中有includelib子目录。正如前面的答案所建议的,我设置了变量CMakeLists.txt来指定在哪里寻找 Boost 1.67.0,如下所示

include_directories(/opt/boost/include/)
include_directories(/opt/boost/lib/)
set(BOOST_ROOT /opt/boost/)
set(BOOST_INCLUDEDIR /opt/boost/include/)
set(BOOST_LIBRARYDIR /opt/boost/lib)
set(Boost_NO_SYSTEM_PATHS TRUE)
set(Boost_NO_BOOST_CMAKE TRUE)

但是 CMake 不尊重这些更改。然后我在网上找到一篇文章:CMake can use a local Boost,意识到我需要更改CMakeCache.txt. 在那里我发现与 Boost 相关的变量仍然指向默认的 Boost 1.53.0,所以难怪 CMake 不尊重我在CMakeLists.txt. 然后我在CMakeCache.txt

Boost_DIR:PATH=Boost_DIR-NOTFOUND
Boost_INCLUDE_DIR:PATH=/opt/boost/include/
Boost_LIBRARY_DIR_DEBUG:PATH=/opt/boost/lib
Boost_LIBRARY_DIR_RELEASE:PATH=/opt/boost/lib

我还更改了指向 Boost 库的非标头、已编译部分的变量以指向我想要的版本。然后 CMake 成功构建了依赖于最新版本 Boost 的库。

于 2018-08-18T00:10:02.080 回答
0

我有同样的问题。我的方法是通过环境变量定义要使用的版本(如果有的话):

# Use speficic version if BOOST_VER environment variable is defined
if(NOT "$ENV{BOOST_VER}" STREQUAL "")
    find_package (Boost "$ENV{BOOST_VER}" EXACT COMPONENTS system unit_test_framework log log_setup filesystem thread REQUIRED)
else()
    # Use default version
    find_package (Boost COMPONENTS system unit_test_framework log log_setup filesystem thread REQUIRED)
endif()

于 2021-07-08T13:44:45.990 回答
0

虽然 configure 可以找到我的 Boost 安装,但 CMake 却找不到。

找到 FindBoost.cmake 并查找 LIBRARY_HINTS 以查看它正在寻找哪些子包。就我而言,它需要 MPI 和图形库。

 # 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 ...我在构建代码时安装了开发包,并且开发包拖入了所有依赖项。我不太确定标准 Boost 安装是否需要 Open MPI,但目前还可以。

sudo apt-get install libboost-mpi-dev libboost-mpi-python-dev
sudo apt-get install libboost-graph-parallel-dev
于 2016-02-25T20:29:17.030 回答