无需回退旧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
相关产品推荐
相关产品推荐

