我正在尝试使用CMake配置项目,但是即使它们位于指定的文件夹中,它也无法找到Boost库。我已指定Boost_INCLUDE_DIR
,Boost_LIBRARYDIR
并且BOOST_ROOT
,但是我仍然得到一个错误说CMake的是无法找到的推动作用。这种错误的原因可能是什么?
find_package(Boost CONFIG)
我正在尝试使用CMake配置项目,但是即使它们位于指定的文件夹中,它也无法找到Boost库。我已指定Boost_INCLUDE_DIR
,Boost_LIBRARYDIR
并且BOOST_ROOT
,但是我仍然得到一个错误说CMake的是无法找到的推动作用。这种错误的原因可能是什么?
find_package(Boost CONFIG)
Answers:
您确定自己的方法正确吗?这个想法是,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在哪里寻找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
${Boost_INCLUDE_DIR}
不是${BOOST_INCLUDE_DIR}
,情况很重要。
BOOST_INCLUDEDIR
'吗?
通过读取FindBoost.cmake
文件本身,可以获得更多帮助。它位于您的“模块”目录中。
一个好的开始是set(Boost_DEBUG 1)
-这将吐出大量关于增强功能在哪里,正在寻找什么的信息,并可能有助于解释为什么找不到它。
它还可以帮助您确定它是否BOOST_ROOT
正常运行。
FindBoost.cmake
如果boost的确切版本未在Available Versions变量中列出,有时也会出现问题。您可以通过阅读更多有关此内容的信息FindBoost.cmake
。
最后,FindBoost.cmake
过去有一些错误。有一两件事你可以尝试是取的一个新版本FindBoost.cmake
出来的CMake的最新版本,然后贴到您的项目文件夹旁边CMakeLists.txt
-那么,即使你有一个旧版本的提升,它将使用新版本的FindBoost.cmake
是在您项目的文件夹。
祝好运。
我自己为这个问题苦了一段时间。事实证明,这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库文件。
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
解决了这个问题
我遇到了同样的问题,上述解决方案均无效。实际上,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
如果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
是导致问题的原因。
Boost_INCLUDE_DIR
而其他版本则使用该标志Boost_INCLUDEDIR
(不带下划线)。您可以通过阅读以下FindBoost.cmake
文件来检查适合您情况的文件:path-to-cmake/Modules/FindBoost.cmake