我正在尝试使用CMake配置项目,但即使它们位于指定的文件夹中,也无法找到Boost库。我已经指定了Boost_INCLUDE_DIR,Boost_LIBRARYDIR和BOOST_ROOT,但是我仍然收到错误,说CMake无法找到Boost。这种错误的原因是什么?
答案 0 :(得分:89)
你确定你是按照正确的方式做到的吗?这个想法是CMake自动设置BOOST_INCLUDE_DIR,BOOST_LIBRARYDIR和BOOST_ROOT。在CMakeLists.txt中执行类似的操作:
FIND_PACKAGE(Boost)
IF (Boost_FOUND)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()
如果未在默认位置安装boost,因此cmake无法找到,你可以告诉cmake在哪里寻找像这样的提升:
SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")
当然这两行必须是之前在CMakeLists.txt中的FIND_PACKAGE(Boost)
答案 1 :(得分:41)
通过阅读FindBoost.cmake文件本身可以获得更多帮助。它位于“模块”目录中。
一个好的开始就是设置(Boost_DEBUG 1) - 这将会提供大量有关boost正在寻找的内容,它正在寻找什么的信息,并且可能有助于解释为什么它无法找到它。
它还可以帮助您确定它是否正确地提升了您的BOOST_ROOT。
如果可用版本变量中未列出精确版本的boost,则FindBoost.cmake有时也会出现问题。您可以通过阅读FindBoost.cmake
找到更多相关信息最后,FindBoost.cmake过去曾有过一些错误。您可能尝试的一件事是从最新版本的cmake中获取更新版本的FindBoost.cmake,并将其与CMakeLists.txt一起粘贴到您的项目文件夹中 - 然后即使您有旧版本的boost,它也会使用项目文件夹中的FindBoost.cmake的新版本。
祝你好运。答案 2 :(得分:8)
我自己一直在努力解决这个问题。事实证明,cmake
正在使用Boost的命名约定来查找Boost库文件,其中库名称是用于构建它的编译器版本的函数。我们的Boost库是使用GCC 4.9.1
构建的,并且该编译器版本实际上存在于我们的系统中;但是,GCC 4.4.7
也恰好安装了。碰巧的是,cmake的FindBoost.cmake
脚本自动检测GCC 4.4.7
安装而不是GCC 4.9.1
安装,因此正在寻找带有" {的Boost库文件{1}}"在文件名中,而不是" gcc44
"。
简单的解决方法是强制cmake假设GCC 4.9存在,方法是将gcc49
设置为" Boost_COMPILER
"在-gcc49
。通过此更改,CMakeLists.txt
查找并找到了我的Boost库文件。
答案 3 :(得分:5)
您还可以通过传递-DBOOST_INCLUDEDIR或指向正确版本提升标题位置的-DBOOST_ROOT来指定您希望CMake使用的Boost版本
示例:
cmake -DBOOST_ROOT=/opt/latestboost
当多个boost版本在同一系统上时,这也很有用。
答案 4 :(得分:3)
我也有类似的问题,发现BOOST_INCLUDE_DIR,BOOST_LIBRARYDIR和BOOST_ROOT env变量必须包含绝对路径。 HTH!
答案 5 :(得分:2)
如果您正在构建自己的boost,请不要忘记使用--layout = versioned,否则搜索特定版本的库将失败
答案 6 :(得分:2)
就我而言,未安装 Boost。我在 Mac 上使用了下面的命令,然后 cmake find_package(Boost) 就像一个魅力
brew install Boost
请注意 Boost 中的大写“B”!
答案 7 :(得分:1)
对于cmake版本3.1.0-rc2拿起提升1.57指定-D_boost_TEST_VERSIONS = 1.57
cmake版本3.1.0-rc2默认提升< = 1.56.0,如使用-DBoost_DEBUG = ON
所见cmake -D_boost_TEST_VERSIONS = 1.57 -DBoost_DEBUG = ON -DCMAKE_BUILD_TYPE = Debug -DCMAKE_C_COMPILER = clang -DCMAKE_CXX_COMPILER = clang ++
答案 8 :(得分:1)
在Ubuntu Trusty64上安装Boost版本1.66.0后尝试为项目运行make
时遇到了同样的问题。错误消息与此类似(不完全相同):
CMake Error at
/usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message):
Unable to find the requested Boost libraries.
Boost version: 0.0.0
Boost include path: /usr/include
Detected version of Boost is too old. Requested version was 1.36 (or newer).
Call Stack (most recent call first):
CMakeLists.txt:10 (FIND_PACKAGE)
明确安装了Boost,但CMake无法检测到它。在花费大量时间修补路径和环境变量之后,我最终最终检查了cmake
本身的选项并找到了以下内容:
--check-system-vars = Find problems with variable usage in system files
所以我在问题目录中运行了以下内容:
sudo cmake --check-system-vars
返回:
Also check system files when warning about unused and uninitialized variables.
-- Boost version: 1.66.0
-- Found the following Boost libraries:
-- system
-- filesystem
-- thread
-- date_time
-- chrono
-- regex
-- serialization
-- program_options
-- Found Git: /usr/bin/git
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/myproject
并解决了这个问题。
答案 9 :(得分:0)
对于任何试图建立CGAL的人来说,还有一点建议,使用静态链接的Boost。仅定义Boost_USE_STATIC_LIBS
是不够的;它会在时间Boost_DEBUG
输出其值时被覆盖。这里要做的是检查“高级”复选框并启用CGAL_Boost_USE_STATIC_LIBS
。
答案 10 :(得分:0)
我遇到了同样的问题,以上解决方案均无效。实际上,include/boost/version.hpp
文件无法读取(由jenkins启动的cmake脚本)。
我必须手动更改(提升)库的权限(即使jenkins属于该组,但这是与jenkins相关的另一个我无法确定的问题):>
chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library
#chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess
答案 11 :(得分:0)
如果将CMAKE_FIND_ROOT_PATH
设置为与BOOST_ROOT
不同,也会发生这种情况。
我遇到了同样的问题,尽管设置了BOOST_ROOT
,但还是遇到了错误。
但是对于ARM的交叉编译,我使用的是Toolchain-android.cmake(出于某种原因):
set(BOOST_ROOT "/home/.../boost")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")
CMAKE_FIND_ROOT_PATH
似乎覆盖了引起问题的BOOST_ROOT
。
答案 12 :(得分:0)
对我来说,这个错误仅仅是因为没有在Ubuntu上安装boost。
sudo apt install build-essential libboost-system-dev libboost-thread-dev libboost-program-options-dev libboost-test-dev
答案 13 :(得分:-1)
也许
manifest.jar
将为您提供帮助。