如何让CMake找到我的替代Boost安装?

时间:2010-06-10 16:39:03

标签: linux boost cmake build-automation wt

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

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

15 个答案:

答案 0 :(得分:37)

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

答案 1 :(得分:33)

我终于能够得到我想要的东西了

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

答案 2 :(得分:17)

短版

您只需要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" )

通常,这是使用语法-D<VAR>=value在CMake命令行上传递的。

版本较长

正式说明FindBoost页面说明这些变量应该用于提示&#39; 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} )

答案 3 :(得分:12)

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

无论如何,看起来所有BOOSTROOTBOOST_ROOTBoost_DIR内容都会烦恼,除非有人设置Boost_NO_BOOST_CMAKE(例如添加到cmd行{{1} }})。

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

答案 4 :(得分:12)

通常,最常见的错误是在添加新选项后不清理构建目录。我从系统数据包管理器安装了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之后做出 - &gt; cmake ../src它会从系统路径设置Boost。然后执行cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src将不会改变任何内容。

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

答案 5 :(得分:11)

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

在寻找图书馆时,CMake首先查看以下变量:

    图书
  • CMAKE_LIBRARY_PATHLD_LIBRARY_PATH
  • CMAKE_INCLUDE_PATHINCLUDE_PATH for includes

如果您在其中一个环境变量中声明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

答案 6 :(得分:9)

我遇到了类似的问题,我可以通过在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})

答案 7 :(得分:3)

在CMake和实验中挖掘之后,我确定CMake不满意我的所有Boost库都包含在/usr/local/lib/boost而不是/usr/local/lib中。一旦我将它们软连接回去,构建就会起作用。

答案 8 :(得分:1)

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

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

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

答案 9 :(得分:1)

我晚上的大部分时间都在努力让这个工作。我尝试了所有的-DBOOST_ *&amp; 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安装。最后那很有用。

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

答案 10 :(得分: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

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

答案 11 :(得分: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 ...我在构建代码时安装了dev包,dev包拖入了所有依赖项。我不太确定标准的Boost安装需要Open MPI,但现在可以了。

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

答案 12 :(得分:0)

我在安装了两个版本的Boost的Linux服务器上遇到了类似的问题。其中之一是预编译的1.53.0版本,该版本在2018年已经过时了。在/usr/include/usr/lib64中。我要使用的版本是1.67.0,因为我要安装的另一个C ++库要求最低版本为1.65.1。它位于/opt/boostinclude子目录中的lib中。如先前答案中所建议,我在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 :(得分:0)

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

答案 14 :(得分: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()