CMake可以找到一个Boost头文件,但找不到另一个

时间:2018-11-26 14:21:47

标签: c++ cmake header-files

由于Boost库可以单独安装在某些系统上(即使可能很少见),所以我想确保它们可用。

我通过检查一些我需要的头文件来做到这一点:

check_include_file_cxx(boost/parameter/keyword.hpp HAVE_BOOST_PARAMETER_KEYWORD_HPP)
check_include_file_cxx(boost/asio/io_service.hpp HAVE_BOOST_ASIO_IO_SERVICE_HPP)

我遇到的问题是CMake声称它可以找到boost/parameter/keyword.hpp头文件,但找不到boost/asio/io_service.hpp头文件:

-- Looking for C++ include boost/parameter/keyword.hpp
-- Looking for C++ include boost/parameter/keyword.hpp - found
-- Looking for C++ include boost/asio/io_service.hpp
-- Looking for C++ include boost/asio/io_service.hpp - not found

是的,ASIO头文件存在:

$ ls -l /usr/include/boost/asio/io_service.hpp
-rw-r--r-- 1 root root 861 nov 13 13:47 /usr/include/boost/asio/io_service.hpp

我安装了Boost 1.67,并且在Debian SID系统上使用的是CMake 3.12.3版本(最新)。

这是check_include_file_cxx函数中的错误还是我遗漏了一些东西?

2 个答案:

答案 0 :(得分:1)

Boost ASIO取决于Boost系统库,它是一个链接库。

由于CMake函数check_include_file_cxx完成了测试程序的完整构建(包括链接,不仅编译),因此除非为链接添加Boost System库,否则它将失败。

这会导致测试失败,即使实际上已经安装了头文件。

要成功使用Boost系统库,必须在检查头文件时将其链接:

check_include_file_cxx(boost/asio/io_service.hpp HAVE_BOOST_ASIO_IO_SERVICE_HPP -lboost_system)

答案 1 :(得分:1)

要检查需要诸如Boost.ASIO之类的库的标头,还有另一种使用状态的方法。我在检查地址清理器时遇到了这个问题,这也是一种用于检查包含和其他标志的可移植方式:

首先,您需要此模块:

include(CMakePushCheckState)

然后您可以推送和弹出检查状态:

cmake_push_check_state()
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
CHECK_CXX_COMPILER_FLAG("-fsanitize=address" COMPILER_SUPPORTS_ADDRESS_SANITIZER)
if(COMPILER_SUPPORTS_ADDRESS_SANITIZER)
  message(STATUS"The compiler ${CMAKE_CXX_COMPILER} supports -    fsanitize=address.")
else(COMPILER_SUPPORTS_ADDRESS_SANITIZER)
  message(FATAL "The compiler ${CMAKE_CXX_COMPILER} doesn't support -fsanitize=address.")
endif(COMPILER_SUPPORTS_ADDRESS_SANITIZER)
cmake_pop_check_state()

在这种情况下,它将是:

cmake_push_check_state()
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lboost_system")
check_include_file_cxx(boost/asio/io_service.hpp HAVE_BOOST_ASIO_IO_SERVICE_HPP)
cmake_pop_check_state()