You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需回退旧CMake策略设置,如何检查Boost与CUDA包是否存在?

无需回退旧CMake策略设置,如何检查Boost与CUDA包是否存在?

嘿,针对你升级CMake 3.30后遇到的Boost和CUDA包检查问题,我给你整理下符合新政策的正确做法,完全不用回退旧策略~

一、Boost包的检查(适配CMP0167政策)

CMake 3.30引入的CMP0167主要是规范了Boost包查找的变量行为,并没有完全禁用find_package(Boost),只是建议你更精准地使用它:

  • 如果你项目中用到了Boost的特定组件(比如filesystem、thread这类),明确指定组件是最推荐的方式,既符合新政策,也能精准检查依赖:
# 示例:检查Boost的filesystem和thread组件
find_package(Boost REQUIRED COMPONENTS filesystem thread)

if(Boost_FOUND)
    # 这里添加你的逻辑,比如引入头文件、链接库
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(你的目标名 PRIVATE ${Boost_LIBRARIES})
endif()
  • 如果你只是想检查Boost是否安装(不需要特定组件),直接调用find_package(Boost)然后检查Boost_FOUND变量即可,新版本CMake会自动适配CMP0167的规则,不会触发警告。

二、CUDA包的检查(适配CMP0146政策)

CMake 3.27的CMP0146明确废弃了旧的find_package(CUDA)命令,推荐使用CUDAToolkit模块来替代,这也是CMake 3.18+官方主推的方式:

# 查找CUDA工具包
find_package(CUDAToolkit)

if(CUDAToolkit_FOUND)
    # 如果需要编译CUDA代码,先启用CUDA语言
    enable_language(CUDA)
    # 链接CUDA相关库,比如cudart
    target_link_libraries(你的目标名 PRIVATE CUDA::cudart)
    # 其他CUDA相关配置逻辑
endif()

用CUDAToolkit_FOUND变量来判断CUDA是否可用,完全符合新政策的要求,不会触发警告。

三、兼容旧版本CMake的方案(可选)

如果你的项目需要同时兼容旧版本CMake(比如低于3.18的版本),可以加个版本判断来兼容两种查找方式:

# 兼容CUDA的新旧查找方式
if(CMAKE_VERSION VERSION_LESS 3.18)
    find_package(CUDA)
    set(CUDA_AVAILABLE ${CUDA_FOUND})
else()
    find_package(CUDAToolkit)
    set(CUDA_AVAILABLE ${CUDAToolkit_FOUND})
endif()

if(CUDA_AVAILABLE)
    # 统一的CUDA处理逻辑
endif()

Boost的话,因为find_package(Boost)在新旧版本中都能正常工作,只是新版本会适配CMP0167的变量规则,所以一般不需要额外的兼容处理。

备注:内容来源于stack exchange,提问作者Ali Aghaeifar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:43:02