Cmake找不到Boost


86

我正在尝试使用CMake配置项目,但是即使它们位于指定的文件夹中,它也无法找到Boost库。我已指定Boost_INCLUDE_DIRBoost_LIBRARYDIR并且BOOST_ROOT,但是我仍然得到一个错误说CMake的是无法找到的推动作用。这种错误的原因可能是什么?


Boost的某些版本使用该标志,Boost_INCLUDE_DIR而其他版本则使用该标志Boost_INCLUDEDIR不带下划线)。您可以通过阅读以下FindBoost.cmake文件来检查适合您情况的文件:path-to-cmake/Modules/FindBoost.cmake
marcelosalloum

仅供参考,如果您要借助CMake支持来增强功能,则应使用find_package(Boost CONFIG)
Dmitry Sazonov

Answers:


105

您确定自己的方法正确吗?这个想法是,CMake的套BOOST_INCLUDE_DIRBOOST_LIBRARYDIRBOOST_ROOT自动。在中执行以下操作CMakeLists.txt

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

如果boost没有安装在默认位置并且无法被CMake找到,则可以告诉CMake在哪里寻找boost,如下所示:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

当然,这两行必须在in之前FIND_PACKAGE(Boost)CMakeLists.txt


36
它是${Boost_INCLUDE_DIR}不是${BOOST_INCLUDE_DIR},情况很重要。
Ihor Kaharlichenko 2011年

3
也许在新版本的cmake中已经改变了,但是这里是参考文档:cmake.org/cmake/help/v3.0/module/FindBoost.html
Nick Desaulniers

2
它对我不起作用...它找到了boost库,但是在编译

1
不应该是' BOOST_INCLUDEDIR'吗?
dmedine '18年

2
@IhorKaharlichenko,但BOOST_ROOT应该是BOOST_ROOT。太好了!让我尝试所有情况,骆驼情况,所有大写字母,带下划线,不带下划线... <face-palm>
Duck Dodgers

53

通过读取FindBoost.cmake文件本身,可以获得更多帮助。它位于您的“模块”目录中。

一个好的开始是set(Boost_DEBUG 1)-这将吐出大量关于增强功能在哪里,正在寻找什么的信息,并可能有助于解释为什么找不到它。

它还可以帮助您确定它是否BOOST_ROOT正常运行。

FindBoost.cmake如果boost的确切版本未在Available Versions变量中列出,有时也会出现问题。您可以通过阅读更多有关此内容的信息FindBoost.cmake

最后,FindBoost.cmake过去有一些错误。有一两件事你可以尝试是取的一个新版本FindBoost.cmake出来的CMake的最新版本,然后贴到您的项目文件夹旁边CMakeLists.txt-那么,即使你有一个旧版本的提升,它将使用新版本的FindBoost.cmake是在您项目的文件夹。

祝好运。


10

我自己为这个问题苦了一段时间。事实证明,这cmake是使用Boost的命名约定来查找Boost库文件的,其中库名是用于构建它的编译器版本的函数。我们的Boost库是使用构建的GCC 4.9.1,实际上我们的系统中存在该编译器版本;但是,GCC 4.4.7也恰好安装了。碰巧的是,cmake的FindBoost.cmake脚本正在自动检测GCC 4.4.7安装而不是安装GCC 4.9.1,因此正在寻找gcc44文件名中带有“ ”而不是“ gcc49”的Boost库文件。

简单的解决方法是通过将cmake设置Boost_COMPILER为中的“ -gcc49”,强制cmake假定存在GCC 4.9 CMakeLists.txt。进行此更改后,FindBoost.cmake查找并找到了我的Boost库文件。


6

您还可以通过传递-DBOOST_INCLUDEDIR-DBOOST_ROOT指向正确的版本Boost标头的位置来指定您希望CMake使用的Boost版本。

例:

cmake -DBOOST_ROOT=/opt/latestboost

当多个boost版本在同一系统上时,这也将很有用。


谢谢,这对我来说适用于Windows的Avro build。
ggurov

5

我也遇到了类似的问题,发现BOOST_INCLUDE_DIR,BOOST_LIBRARYDIR和BOOST_ROOT环境变量必须包含绝对路径。HTH!


是。由于BOOST_ROOT env中的相对路径,发生了相同的问题。非常感谢您!
korst1k

2

make在Ubuntu Trusty64上安装Boost 1.66.0之后尝试运行项目时遇到相同的问题。错误消息类似于(不完全一样)此消息:

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

解决了这个问题


2

要获取cmake版本3.1.0-rc2,请boost 1.57指定-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2默认boost<=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++


2

如果您要构建自己的增强功能,请不要忘记使用,--layout=versioned否则搜索特定版本的库将失败


1

特别向尝试使用静态链接Boost构建CGAL的任何人提供更多建议。仅仅定义是不够的Boost_USE_STATIC_LIBS; 它会在Boost_DEBUG输出其值时被覆盖。此处要做的是选中“高级”复选框并启用CGAL_Boost_USE_STATIC_LIBS


0

我遇到了同样的问题,上述解决方案均无效。实际上,include/boost/version.hpp无法读取该文件(由jenkins启动的cmake脚本)。

我不得不手动更改(boost)库的权限(即使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

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是导致问题的原因。


-1

也许

brew install boost

会帮助你。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.