CMake CMP0167警告:Boost项目NO_MODULE参数的作用及弊端咨询
CMP0167警告与find_package的NO_MODULE参数解析
NO_MODULE参数的实际作用
- 强制CMake跳过内置的
Find<Package>.cmake模块(比如被移除的旧版FindBoost.cmake),直接查找包自身提供的Config配置文件(比如BoostConfig.cmake或boost-config.cmake)。 - 这正是CMake 3.30+针对Boost的推荐用法——官方已经移除了维护多年的FindBoost模块,转而要求依赖Boost自身提供的配置逻辑来定位库文件。
- 简单说,就是把“找包”的逻辑从CMake官方脚本,切换成了Boost开发团队自己维护的脚本。
使用NO_MODULE的潜在弊端
- 旧Boost版本不兼容:Boost 1.70之前的版本大多没有提供完整的Config模块,用NO_MODULE的话,旧版本Boost会直接导致CMake找不到依赖,抛出错误。
- 缺少容错 fallback:原来的FindBoost模块带了不少兼容性处理,比如手动指定
BOOST_ROOT时的兜底查找逻辑;但Config模块完全依赖Boost安装时生成的配置文件,一旦安装路径不符合预期,没有备用方案。 - 旧CMake版本适配风险:如果项目要支持CMake 3.15之前的版本,NO_MODULE的查找逻辑可能存在bug,比如对Config文件的路径匹配规则不完善,容易出现找不到包的情况。
- 参数细节差异:FindBoost和BoostConfig支持的参数虽然大部分兼容,但版本匹配、组件查找的细节有区别,比如有些旧的FindBoost参数在Config模式下会被忽略,需要调整写法。
兼容新旧环境的小技巧
如果你的项目要兼顾不同版本的CMake和Boost,可以加个条件判断:
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24") # 3.24+用Config模式,符合CMP0167要求 find_package(Boost REQUIRED NO_MODULE) else() # 旧版本继续用FindBoost模块 find_package(Boost REQUIRED COMPONENTS your_components_here) endif()
内容的提问来源于stack exchange,提问作者Glen Dayton
相关产品推荐
相关产品推荐

