CMake может найти один заголовочный файл Boost, но не другой - PullRequest
0 голосов
/ 26 ноября 2018

Поскольку библиотеки Boost могут быть отдельно установлены в какой-либо системе (хотя это, вероятно, будет редко), я хочу убедиться, что они доступны.

Я делаю это, проверяя некоторые из файлов заголовков, которые яneed:

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 и используется версия CMake 3.12.3 в системе SID Debian (обновлена).

Это ошибка вcheck_include_file_cxx функция или я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Чтобы проверить заголовки, для которых требуется такая библиотека, как 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()
0 голосов
/ 26 ноября 2018

Boost ASIO зависит от системной библиотеки Boost, которая является библиотекой ссылок.

Поскольку функция CMake check_include_file_cxx выполняет полную сборку (включая компоновку, а не только компиляцию) тестовой программы,он не будет работать, если для ссылки не будет добавлена ​​системная библиотека Boost.

Это приведет к сбою теста, даже если файл заголовка фактически установлен.

Для успешной работы библиотеку Boost System необходимоссылка при проверке файла заголовка:

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