【发布时间】: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_packagemanual 中记录的其他一些变量(例如喜欢 Module Mode 以及一些与搜索相关的内容)来保持向后兼容性并在配置步骤通过 CMake CLI 传递它们.