我如何让 CMake 找到我的替代 Boost 安装?
- 2024-10-17 08:47:00
- admin 原创
- 76
问题描述:
我已经安装了最新版本的 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。
无论如何,看起来所有的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 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_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++ 版本管理器
解决方案 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
,它有include
和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 可以使用本地 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()
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件