【问题标题】:Checking for specific boost headers with cmake使用 cmake 检查特定的 boost 标头
【发布时间】:2020-12-11 19:53:35
【问题描述】:

有没有办法使用 CMake 检查特定的 Boost 标头是否可用? 我对boost/multiprecision/mpfr.hppboost/multiprecision/mpc.hpp 特别感兴趣。

find_package(boost REQUIRED) 可以判断我是否安装了 boost,但它不能判断其中一个标头是否丢失。

我也知道check_include_file_cxx 宏,但它似乎采用了绝对路径。

【问题讨论】:

  • 您可以使用 COMPONENTS 选项来确保 multiprecision 存在 https://cmake.org/cmake/help/latest/module/FindBoost.html?highlight=boost
  • 谢谢,编辑了逗号。 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2019-03-21
    相关资源
    最近更新 更多