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

2024-10-17 08:47:00
admin
原创
75
摘要:问题描述:我已经安装了最新版本的 Boost /usr/local(包括/usr/local/include/boost和 中的库/usr/local/lib/boost),现在我正尝试从源代码安装 Wt,但 CMake(版本 2.6)似乎找不到 Boost 安装。它试图提供有关设置 BOOST_DIR 和 ...

问题描述:

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

我收到的最新错误消息是无法找到库,但似乎表明它使用“/usr/local/include”作为包含路径,这是不正确的(而且我似乎无法修复它)。有没有现成的解决方案,还是我需要在 CMake 内部捣鼓一下才能弄清楚?


解决方案 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 .

解决方案 2:

我终于得到了我想要的

cmake -DCMAKE_INSTALL_PREFIX=$TARGET \n    -DBoost_NO_BOOST_CMAKE=TRUE \n    -DBoost_NO_SYSTEM_PATHS=TRUE \n    -DBOOST_ROOT:PATHNAME=$TARGET \n    -DBoost_LIBRARY_DIRS:FILEPATH=${TARGET}/lib

解决方案 3:

简短版本

您只需要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 \n      -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} )

解决方案 4:

我遇到了类似的问题,CMake 仅找到供应商安装的 Boost,但我的集群有一个本地安装的版本,这正是想要使用的。Red Hat Linux 6。

无论如何,看起来所有的BOOSTROOTBOOST_ROOTBoost_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 build->,cmake ../src它会从系统路径设置 Boost。那么执行此操作cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src不会改变任何事情。

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

解决方案 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})

解决方案 7:

有一种通用方法可以为 CMake 提供关于在哪里找到库的指示。

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

  • CMAKE_LIBRARY_PATH以及LD_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++ 版本管理器

解决方案 8:

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

解决方案 9:

尝试这个标志:-DBoost_NO_BOOST_CMAKE=TRUE。经过几个小时的尝试和修复,只有添加这个标志对我有用。

我运行的是:

mkdir build && cd build
cmake .. -DBoost_NO_BOOST_CMAKE=TRUE

解决方案 10:

我花了整个晚上的时间尝试让它工作。我尝试了 CMake 中的所有 -DBOOST_* 和 c. 指令,但它仍然链接到我的系统 Boost 库,即使在反复清除和重新配置我的构建区域之后也是如此。

最后,我修改了生成的 Makefile,并使 cmake_check_build_system 目标无效,不执行任何操作(如“echo ""”),这样在运行 make 时它就不会覆盖我的更改,然后在 build/ 目录中执行“grep -rl "lboost_python" * | xargs sed -i "s:-lboost_python:-L/opt/sw/gcc5/usr/lib/ -lboost_python:g”,将所有构建命令明确指向我想要使用的 Boost 安装。最后,成功了。

我承认这是一个丑陋的临时解决方案,但我只是想在这里为那些遇到同样困难并想绕过它并完成工作的人们提供帮助。

解决方案 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:

我在 Linux 服务器上遇到了类似的问题,该服务器上安装了两个版本的 Boost。一个是预编译的 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 可以使用本地 Boost,并意识到我需要更改 中的变量CMakeCache.txt。在那里我发现与 Boost 相关的变量仍然指向默认的 Boost 1.53.0,所以难怪 CMake 不遵守我在 中的更改CMakeLists.txt。然后我在 中设置了与 Boost 相关的变量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 最新版本的库。

解决方案 13:

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

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

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

解决方案 14:

尽管 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

解决方案 15:

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

解决方案 16:

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

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用