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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:15:15