【问题标题】:How and when to make use of the cmake 3.18 option Boost_NO_BOOST_CMAKE?如何以及何时使用 cmake 3.18 选项 Boost_NO_BOOST_CMAKE?
【发布时间】:2020-11-15 12:18:11
【问题描述】:

现状

Cmake 3.18 官方文档指出:

如果 Boost 是使用 boost-cmake 项目或从 Boost 1.70.0 构建的 它提供了一个包配置文件,用于 find_package 的配置模式。该模块查找包 名为 BoostConfig.cmake 或 boost-config.cmake 的配置文件和 将结果存储在缓存条目“Boost_DIR”中。如果找到,包 配置文件被加载并且这个模块返回没有进一步 行动。请参阅 Boost CMake 包配置的文档以了解 提供的详细信息。

将 Boost_NO_BOOST_CMAKE 设置为 ON,以禁用对 boost-cmake 的搜索。

问题描述

这对 cmake 专家来说可能有意义,但由于这种解释缺乏更广泛的上下文解释,它并不能真正帮助 cmake 初学者。

问题

有人可以扩展此文档吗?例如,为什么要将 Boost_NO_CMAKE 设置为 ON,默认行为何时可能有问题,以及如何设置最佳实践选项?

基本答案

例如,有一些基本解释here 说明 Boost 1.70 提供了一种将 Boost 与 CMake 结合使用的新方法,即使用 Boost BoostConfig.cmake 而不是来自 CMake 发行版的那个.

老办法:

set(Boost_NO_BOOST_CMAKE ON)

find_package(Boost REQUIRED COMPONENTS thread timer)

include_directories(${Boost_INCLUDE_DIRS}
    ...)

link_directories(${Boost_LIBRARY_DIRS}
    ...)

target_link_libraries(...
    ${Boost_LIBRARIES}
    ...)

新方法:

set(Boost_NO_BOOST_CMAKE OFF)

find_package(Boost REQUIRED COMPONENTS thread timer)

target_link_libraries(...
    Boost::thread
    Boost::timer
    ...)

扩展此信息(例如,当我们无法控制代码项目时如何进行更改,或如何确保追溯兼容性)对于非 cmake 专家肯定有用。

【问题讨论】:

  • 更好的方法:find_package(Boost REQUIRED CONFIG COMPONENTS ...) -- 强制 Config Mode 查找新的 Boost 包(根本不需要使用/设置提到的变量)并完全忘记 CMake 的运送的取景器。 AFAIK 将被弃用。
  • @zaufi 谢谢。当我们无法控制它们时,如何调整实现旧 cmake 方式的包?
  • 在这种情况下,您无法控制源,您绝对无法将变量更改为导入的目标。因此,您可以使用此变量和 find_package manual 中记录的其他一些变量(例如喜欢 Module Mode 以及一些与搜索相关的内容)来保持向后兼容性并在配置步骤通过 CMake CLI 传递它们.

标签: c++ boost cmake


【解决方案1】:

当 Boost 没有正式支持 CMake 时,后者有自己的 FindBoost.cmake 模块。对于每个 Boost 版本,CMake 团队都应该针对最新的 Boost 版本和其他一些东西对其进行修复,因此更新的模块仅在下一个 CMake 版本中可用。 find_packageModule Mode 中使用的随附模块专用于没有全功能 CMake 支持的软件包。

自从(相对)最近以来,Boost 获得了官方 CMake 支持,提供了 find_package配置模式中使用的 BoostConfig.cmake 模块。但是,根据 CMake 设置,使用的 find_package 签名和安装的 Boost 版本可能会有所不同。

Boost_NO_BOOST_CMAKE 阻止FindBoost.cmake 模块使用BoostConfig.cmake。这意味着无论安装和找到什么 Boost 版本,即使它具有“本机”CMake 支持——FindBoost.cmake 也应该忽略它(即模块,而不是找到的结果)。

为什么?因为即使 CMake 团队试图保持其FindBoost.cmake 与旧的 CMake/Boost 版本向后兼容并同时与现代 Boost 同步,也有可能面临他们的行为差异。为了让用户(关心兼容性)完全控制查找内容和方式(通过FindBoost.cmake),添加了上述变量。

【讨论】:

  • "但是,根据 CMake 设置,使用的 find_package 签名和安装的 Boost 版本查找结果可能会有所不同。" 是否意味着没有办法制作一个 CMake 脚本,无论存在任何版本的 Boost/Cmake 版本,它都可以正常工作吗?我仍然很难理解如何制作一个稳定的 cmake 线,“简单”地找到提升并将目标链接到它。
猜你喜欢
  • 1970-01-01
  • 2021-07-30
  • 2014-09-10
  • 1970-01-01
  • 2017-03-16
  • 2014-08-26
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多