我使用 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 模块不兼容。
|
|