Cmake找不到Boost

时间:2010-09-28 00:05:55

标签: boost cmake

我正在尝试使用CMake配置项目,但即使它们位于指定的文件夹中,也无法找到Boost库。我已经指定了Boost_INCLUDE_DIR,Boost_LIBRARYDIR和BOOST_ROOT,但是我仍然收到错误,说CMake无法找到Boost。这种错误的原因是什么?

14 个答案:

答案 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

将为您提供帮助。