由于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
函数中的错误还是我遗漏了一些东西?
答案 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()