CMake 3.29中enable_language(CUDA)未设置CUDA_FOUND变量的问题
CMake 3.29启用CUDA后CUDA_FOUND未设置的解决方法
问题背景
在CMake 3.29版本中,使用enable_language(CUDA)启用CUDA后,CUDA_FOUND变量未被设置,执行配置时触发错误提示:"CUDA is not found or enabled.";但在CMake 3.26版本中,通过设置CMP0146旧策略并调用find_package(CUDA REQUIRED)的代码可以正常运行。
失效代码(CMake 3.29)
cmake_minimum_required(VERSION 3.29) project(demo) enable_language(CUDA) if (CUDA_FOUND) message(STATUS "CUDA is enabled.") else () message(FATAL_ERROR "CUDA is not found or enabled.") endif ()
生效代码(CMake 3.26)
cmake_minimum_required(VERSION 3.26) project(demo) if (POLICY CMP0146) cmake_policy(SET CMP0146 OLD) endif () find_package(CUDA REQUIRED) if (CUDA_FOUND) message(STATUS "CUDA is enabled.") else () message(FATAL_ERROR "CUDA is not found or enabled.") endif ()
解决方法
原因说明
CMake 3.27及以上版本中,enable_language(CUDA)不再自动设置CUDA_FOUND变量——该变量属于旧版find_package(CUDA)模块的产物。现代CMake推荐通过enable_language(CUDA)或project(XXX LANGUAGES CUDA)直接启用CUDA语言,对应的验证方式是检查CMAKE_CUDA_COMPILER变量是否存在,或使用CUDAToolkit模块替代旧的CUDA模块。
方法1:改用CMAKE_CUDA_COMPILER检查
enable_language(CUDA)在CUDA编译器不存在时会直接终止配置(默认行为),如果需要显式检查,可使用CMAKE_CUDA_COMPILER变量:
cmake_minimum_required(VERSION 3.29) project(demo) enable_language(CUDA) if(CMAKE_CUDA_COMPILER) message(STATUS "CUDA is enabled.") else() message(FATAL_ERROR "CUDA is not found or enabled.") endif()
若无需额外提示,甚至可以省略检查步骤——enable_language失败时CMake会自动抛出错误。
方法2:使用现代CUDAToolkit模块
如果需要保留CUDA_FOUND变量的检查逻辑,可使用官方推荐的CUDAToolkit模块替代旧的CUDA模块:
cmake_minimum_required(VERSION 3.29) project(demo) find_package(CUDAToolkit REQUIRED) if(CUDA_FOUND) message(STATUS "CUDA is enabled.") else() message(FATAL_ERROR "CUDA is not found or enabled.") endif() # 后续可使用CUDAToolkit提供的变量,例如CUDAToolkit_INCLUDE_DIRS、CUDAToolkit_LIBRARIES等
方法3:强制启用旧策略(不推荐)
若必须兼容旧版find_package(CUDA)的行为,可设置CMP0146为OLD策略,但该方式属于过渡方案,不推荐长期使用:
cmake_minimum_required(VERSION 3.29) project(demo) if(POLICY CMP0146) cmake_policy(SET CMP0146 OLD) endif() find_package(CUDA REQUIRED) if(CUDA_FOUND) message(STATUS "CUDA is enabled.") else() message(FATAL_ERROR "CUDA is not found or enabled.") endif()
内容的提问来源于stack exchange,提问作者YQ CUI
相关产品推荐
相关产品推荐

