我使用 CMake 版本 3.30.5。我的 Boost 项目现在在调用 CMake 时发出此警告:

CMake 警告 (dev) 位于 euler16_power_digit_sum/CMakeLists.txt:3 (find_package):未设置策略 CMP0167:FindBoost 模块已被删除。运行“cmake –help-policy CMP0167”获取策略详细信息。使用 cmake_policy 命令设置策略并隐藏此警告。

起初我按照建议进行操作并设置 CMake 策略,在命令行上(旧版 CMake 无法识别策略 CMP0167)以及在我的 CMakeLists.txt 文件中。

CMake 在 3.30 版本中实现了 CMP0167 政策。

我认为问题的根本原因是 Boost 包使用了一些已弃用的 CMake 命令,因此 Kitware 在 CMake 中实施了该策略。

我还发现在我的 find_package 命令中添加“NO_MODULE”也会抑制警告:

find_package(Boost REQUIRED NO_MODULE)

现在它似乎运行良好,但 NO_MODULE 实际上在做什么,我使用它有什么缺点?


最佳答案
1

TL;DR

如果您使用的是 Boost 1.70 或更新版本,那么您肯定没问题。添加以下代码以消除警告并检查一切是否仍按预期工作:

if(POLICY CMP0167)
  cmake_policy(SET CMP0167 NEW)
endif()

完整详细答案

CMake 附带一个
FindBoost.cmake用于查找 Boost 的模块。对于 Boost 的每个版本,CMake 都会添加代码来检测新的 Boost 库及其依赖项。对于所使用的 Boost 版本,您始终

随着 Boost 1.70 的推出,它可以替代 CMake 的 find 模块。它仅在配置模式或无模块模式BoostConfig.cmake下明确调用查找 Boost 时使用。由于大多数用户不关心这些细节,大多数项目仍然依赖 CMake 的 find 模块。find(Boost CONFIG)find(Boost NO_MODULE)

CMake 版本 3.30 禁用了 find 模块的使用,因此使用 Boost 的配置文件。为了让项目与旧行为保持兼容,引入了。如果将其设置为OLD,则仍将使用 find 模块(当最低要求的 CMake 版本低于 3.30 时也是如此)。否则,CMake 会尝试使用 Boost 提供的配置文件来查找 Boost。

上面的代码片段将 CMP0167 设置为NEW消除警告并使用新行为。它假设 Boost 1.70 已经足够老了,没有人再使用它了。

如果您仍然依赖使用较旧的 Boost 版本,请计划更新到 Boost 1.70。CMake 的未来版本将破坏您的设置:要么删除 FindBoost.cmake,要么 Boost 与现在不受维护的 find 模块不兼容。