我已经在/usr/local
中安装了最新版本的Boost(包含在/usr/local/include/boost
和/usr/local/lib/boost
中的库),我现在正尝试从源代码安装Wt,但是CMake(版本2.6)似乎无法找到Boost安装。它尝试提供有关设置BOOST_DIR和Boost_LIBRARYDIR的有用建议,但我无法通过调整这些变量来使其工作。
我得到的最新错误消息是它无法找到库,但它似乎表明它正在使用“/ usr / local / include”作为包含路径,这是不正确的(并且我似乎无法解决它)。是否有解决方案可以解决这个问题,或者我是否需要在CMake内部进行扫描才能解决问题?
答案 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。
无论如何,看起来所有BOOSTROOT
,BOOST_ROOT
和Boost_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_PATH
和LD_LIBRARY_PATH
CMAKE_INCLUDE_PATH
和INCLUDE_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/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 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的库。
答案 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()