C++ CMake可以找到一个Boost头文件,但不能找到另一个
由于Boost库可以单独安装在某些系统上(尽管可能很少),我希望确保它们可用 我通过检查我需要的一些头文件来实现这一点:C++ CMake可以找到一个Boost头文件,但不能找到另一个,c++,cmake,header-files,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声称它可以找到bo
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
check_include_file_cxx(boost/asio/io_service.hpp HAVE_BOOST_ASIO_IO_SERVICE_HPP -lboost_system)
是的,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(最新版本)
这是检查包含文件功能中的错误还是我遗漏了什么?Boost ASIO取决于Boost系统库,它是一个链接库 由于CMake函数
check_include_file_cxx
对测试程序进行完整构建(包括链接,而不仅仅是编译),除非为链接添加了Boost系统库,否则它将失败
这会导致测试失败,即使头文件已实际安装
要成功,检查头文件时必须链接Boost系统库:
-- 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
check_include_file_cxx(boost/asio/io_service.hpp HAVE_BOOST_ASIO_IO_SERVICE_HPP -lboost_system)
要检查需要Boost.ASIO之类库的头文件,还有另一种使用状态的方法。我在检查地址消毒器时遇到了这种情况,这是一种检查include和其他标志的便携式方法: 首先,您需要此模块:
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()
CMakeFiles/CMakeOutput.log和CMakeFiles/CMakeError.log在说什么?@MatthieuBrucher Doh忘了检查,它帮助我找到了原因,包括解决方案。@MatthieuBrucher是的,这应该是我做的第一件事,糟糕的我。尽管如此,我还是会保留这个问题,因为它可能会在将来帮助其他懒惰的人。@John,因为Boost ASIO实际上是一个只包含头的库,而模块只查找链接器库。它会抱怨如果你给它一个只有标题的库,比如
asio
@John,而对于只有标题的库,你可能仍然会得到一个有效的提升,但是你想要一个有你想要的标题的版本(好吧,我同意你可以问一个特定的版本,但是有时候会删除一些lib,所以在版本的基础上检查是否存在更安全). 技巧不仅用于检查include,还用于其他标志,如我的回答所示。