【问题标题】:How can I get CMake to find my alternative Boost installation?如何让 CMake 找到我的替代 Boost 安装?
【发布时间】:2011-03-02 06:44:53
【问题描述】:

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

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

【问题讨论】:

  • findBoost 在底层问题很简单时很难,而在底层问题很困难时则不可能。 CMake 明智的做法是添加一个 useBoost(1.55 /here/is/the/include/dir /here/is/the/lib/dir) 选项来绕过所有这些脆弱的逻辑。

标签: linux boost cmake build-automation wt


【解决方案1】:

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

【讨论】:

  • 如果你安装在/usr/local/boost,BOOST_ROOT不应该是/usr/local/boost吗?如果这对库有效但失败(因为它们不在 /usr/local/boost 您描述的方式下),请尝试创建符号链接 /usr/local/boost/libs -> /usr/local/lib/boost
  • 我在第一句中输入了错误的包含文件路径,现在已修复。
  • autotools 和 make 存在于使用 Cygwin AFAIK 在 Windows 上运行的版本中,但很难使用它们。我认为花在开发像 CMake 这样每个人都需要学习如何使用除了自动工具之外的新系统上的努力,最好花在使当前工具更易于使用上。
  • 对我有用的 最简单 方法是在 CMakeLists.txt 中设置(BOOST_ROOT .../myPath/...)
  • @jmendeth qmake 怎么样?它也是跨平台的(至少我已经为 Win、Linux 和 MacOS 构建了相同的程序)并且似乎没有 CMake 的魔力。恕我直言,qmake 更容易学习。缺点是它与 Qt 相关。
【解决方案2】:

我终于可以得到我想要的东西了

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

【讨论】:

  • -DBoost_NO_BOOST_CMAKE=TRUE 帮我搞定了。
  • 使用 -DBOOST_ROOT:PATHNAME 对我来说已经足够了。
【解决方案3】:

短版

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

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

【讨论】:

    【解决方案4】:

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

    无论如何,看起来所有BOOSTROOTBOOST_ROOTBoost_DIR 的东西都会被惹恼,除非还设置Boost_NO_BOOST_CMAKE(例如添加到cmd 行-DBoost_NO_BOOST_CMAKE=TRUE)。

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

    【讨论】:

    • CMake 本身并没有那么糟糕,并且随着时间的推移越来越好。但是 findBoost 和 findPython 模块显然是由讨厌这个世界的家伙编写的。
    • 这对我来说也是必要的(Ubuntu Linux)
    【解决方案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
    

    就是这样。呸呸呸。

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

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

    【讨论】:

    • 当我尝试得到“项目未使用手动指定的变量:CMAKE_INCLUDE_PATH CMAKE_LIBRARY_PATH”
    • 什么版本的 boost 和 cmake?
    • CMake 3.2.2 和 Boost 1.55
    • 不要使用我提到的变量。使用 BOOST_ROOT/BOOST_INCLUDEDIR/BOOST_LIBRARYDIR 并将 Boost_NO_SYSTEM_PATHS 设置为 ON 就足够了。
    • 当我在新的构建目录中执行 -DBoost_NO_SYSTEM_PATHS=ON -DBOOST_ROOT=/home/doriad/bin/boost_1.55.0/ 时,我收到编译器错误,显示 /usr/include/boost 头文件仍然存在正在使用。
    【解决方案6】:

    我遇到了类似的问题,我可以通过将以下几行添加到我的 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})
    

    【讨论】:

    • 您好,我按照您的提示进行操作,出现错误Could not find module FindBOOST.cmake or a configuration file for package BOOST.如何处理?
    • @just_rookie 我认为您可以通过使用本地 cmake 来解决此问题,然后使用它来编译自定义的 Boost 库和您的代码。
    【解决方案7】:

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

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

    • CMAKE_LIBRARY_PATHLD_LIBRARY_PATH 用于图书馆
    • CMAKE_INCLUDE_PATHINCLUDE_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++ version manager

    【讨论】:

      【解决方案8】:

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

      【讨论】:

      • 为什么会有不同?您在 CMakeLists.txt 中定义您的 BOOST_ROOT
      【解决方案9】:

      我晚上的大部分时间都在努力让它发挥作用。我尝试了所有的 -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 安装。最后,成功了。

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

      【讨论】:

        【解决方案10】:

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

        唯一有帮助的是从 Boost 页面下载最新版本,编译并安装为 在 Installing Boost 1.50 on Ubuntu 12.10 中描述。

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

        【讨论】:

          【解决方案11】:

          在 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
          

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

          【讨论】:

            【解决方案12】:

            我在安装了两个版本的 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相关的变量

            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 的库。

            【讨论】:

              【解决方案13】:

              虽然 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
              

              【讨论】:

                【解决方案14】:

                我刚刚添加了环境变量Boost_INCLUDE_DIR或者添加到cmake命令-DBoost_INCLUDE_DIR并指向include文件夹。

                【讨论】:

                  【解决方案15】:

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

                  # 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()
                  
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-12-08
                    • 2011-04-18
                    • 2020-11-25
                    相关资源
                    最近更新 更多