【问题标题】:Checking for specific boost headers with cmake使用 cmake 检查特定的 boost 标头
【发布时间】:2020-12-11 19:53:35
【问题描述】:
有没有办法使用 CMake 检查特定的 Boost 标头是否可用?
我对boost/multiprecision/mpfr.hpp 和boost/multiprecision/mpc.hpp 特别感兴趣。
find_package(boost REQUIRED) 可以判断我是否安装了 boost,但它不能判断其中一个标头是否丢失。
我也知道check_include_file_cxx 宏,但它似乎采用了绝对路径。
【问题讨论】:
-
-
谢谢,编辑了逗号。 COMPONENTS 仅适用于已编译的库,如答案 here 中所述。如果我添加COMPONENTS multiprecision,即使在我的计算机上我已经正确安装了它,构建也会失败。
-
“我也知道check_include_file_cxx 宏,但它似乎采用了绝对路径。” - 不,check_include_file_cxx 宏与相对路径完美地工作(并且打算工作),基本上与您在#include <> 指令中使用的路径一起工作。参见例如that question 为例。您可以将 Boost_INCLUDE_DIRS 变量的值用于此宏使用的 CMAKE_REQUIRED_INCLUDES。
标签:
c++
boost
cmake
header
【解决方案1】:
我认为我不必要地使事情复杂化了。我想检查特定标头的原因是因为在 Ubuntu 18.04 中我有 mpfr.hpp 标头,但没有 mpc.hpp 标头。后来我发现这是因为后者是从Boost 1.69版本开始包含的,所以将VERSION 1.69添加到find_package(...)对我来说已经足够了。
尽管如此,正如@Tsyvarev 指出的那样,使用check_include_file_cxx 的解决方案是可能的。
宏check_include_file_cxx 不仅会检查所需的头文件是否可用,还会尝试编译一个小型测试程序。为此,它还需要链接到库(-lmpfr 用于boost/multiprecision/mpfr.hpp 和-lmpfr -lmpc 用于boost/multiprecision/mpc.hpp)。
这对我有用。
find_package(Boost REQUIRED
VERSION 1.69)
if ( Boost_FOUND )
include_directories(${Boost_INCLUDE_DIRS})
endif()
include(CheckIncludeFileCXX)
cmake_policy(SET CMP0075 NEW) # Required for specifying CMAKE_REQUIRED_LIBRARIES
set(CMAKE_REQUIRED_INCLUDES "${Boost_INCLUDE_DIRS}")
set(CMAKE_REQUIRED_LIBRARIES "mpfr" "mpc" "gmp")
set(REQUIRED_BOOST_HEADERS
"boost/multiprecision/mpfr.hpp;boost/multiprecision/mpc.hpp"
)
foreach(HEADER ${REQUIRED_BOOST_HEADERS})
check_include_file_cxx("${HEADER}" ${HEADER}_FOUND)
if (NOT ${HEADER}_FOUND)
message(FATAL_ERROR "HEADER ${HEADER} NOT FOUND")
endif()
endforeach()