我使用CMake版本3.30.5。我的 Boost 项目现在在调用 CMake 时发出此警告:
CMake 警告(开发)位于 euler16_power_digit_sum/CMakeLists.txt:3 (find_package): 未设置策略 CMP0167:FindBoost 模块已删除。 运行“cmake --help-policy CMP0167”了解策略详细信息。使用 cmake_policy 命令 设置策略并抑制此警告。
首先,我按照建议进行操作并在命令行(旧版 CMake 版本无法识别策略 CMP0167)和我的 CMakeLists.txt 文件中设置 CMake 策略。
CMake 在 3.30 版本中实现了 CMP0167 策略。
我相信问题的根本原因是 Boost 包使用了一些已弃用的 CMake 命令,因此 Kitware 在 CMake 中实施了该策略。
我还发现将“NO_MODULE”添加到我的 find_package 命令中也抑制了警告:
find_package(Boost REQUIRED NO_MODULE)
现在看起来工作正常,但是 NO_MODULE 实际上在做什么,我使用它有什么缺点?
TL;博士
如果您使用的是 Boost 1.70 或更新版本,那么肯定没问题。添加以下代码以消除警告并检查一切是否仍按预期工作:
if(POLICY CMP0167)
cmake_policy(SET CMP0167 NEW)
endif()
详细解答
CMake 附带了一个
FindBoost.cmake
模块来查找 Boost。对于 Boost 的每个版本,CMake 添加了代码来检测新的 Boost 库及其依赖项。对于所使用的 Boost 版本,您始终需要更新版本的 CMake。
随着 Boost 1.70 的出现,
BoostConfig.cmake
可以用来代替 CMake 的查找模块。仅当在配置模式 find(Boost CONFIG)
或无模块模式 find(Boost NO_MODULE)
中显式调用查找 Boost 时才使用它。由于大多数用户并不关心这些细节,因此大多数项目仍然依赖 CMake 的 find 模块。
CMake 版本 3.30 禁用 find 模块,因此使用 Boost 的配置文件。为了允许项目与旧行为保持兼容,引入了CMake 策略 CMP0167。如果设置为
OLD
,则仍然使用 find 模块(当所需的最低 CMake 版本低于 3.30 时也是如此)。否则,CMake 会尝试使用 Boost 提供的配置文件来查找 Boost。
上面截取的代码将 CMP0167 设置为
NEW
以消除警告并使用新行为。它假设 Boost 1.70 已经足够老了,没有人再使用它了。
如果您仍然依赖使用较旧的 Boost 版本,请计划更新到 Boost 1.70。 CMake 的未来版本将破坏您的设置:要么删除 FindBoost.cmake,要么 Boost 与现在未维护的 find 模块不兼容。