Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake可以找到一个Boost头文件,但不能找到另一个_C++_Cmake_Header Files - Fatal编程技术网

C++ CMake可以找到一个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

由于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
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,还用于其他标志,如我的回答所示。