PAYATHON 2026

CMake 为何找不到 CUDA,并提示 CUDA Toolkit 目录为空?

排障赵师傅

结论

这段报错说明,识别 CUDA 编译器时,构建工具使用的 CudaToolkitDir 属性为空,导致无法定位 CUDA Toolkit。仅凭这段报错,无法判断 CUDA 是否已安装,也不能断定某个版本的 CMake 存在缺陷。

如果使用 Visual Studio 生成器,可以先在运行 CMake 的终端中,将环境变量 CudaToolkitDir 设置为实际的 CUDA Toolkit 根目录,再用 --fresh 重新配置。

为什么目录会变成空字符串?

配置执行到这一行时:

project(hello LANGUAGES CUDA)

CMake 就需要识别 CUDA 编译器,并尝试编译 CMakeCUDACompilerId.cu。此时还没有执行到后面的 find_package(CUDAToolkit REQUIRED)。CMake 的 project() 文档说明,启用指定语言是 project() 的执行步骤之一。

使用 Visual Studio 生成器时,编译器识别过程会涉及 MSBuild 和 NVIDIA 的 CUDA 构建规则。从报错可以看出,这些规则检查 Toolkit 目录时,读取到的路径值为空字符串,因此输出为 ''。

路径为什么没有正确赋值,还需要结合完整日志、生成器、环境变量和 CUDA 的 Visual Studio 集成安装情况排查。删节后的报错不足以确定具体原因。

CudaToolkitDir 是什么?

CudaToolkitDir 是 NVIDIA CUDA 构建规则使用的 MSBuild 属性,表示 CUDA Toolkit 根目录。NVIDIA 官方文档介绍了通过 MSBuild 的 /p:CudaToolkitDir=... 参数指定目录的用法。参见 CUDA 13.2 Windows 安装指南。

这个属性也可以通过同名环境变量传入。MSBuild 会将名称合法的环境变量作为属性读取,但项目文件中显式定义的属性可以覆盖环境变量的值。参见 Microsoft 的说明。

这三个名称的用途不同:

名称用途
CudaToolkitDirMSBuild 使用的 CUDA Toolkit 路径属性,可通过同名环境变量提供
CUDA_PATHCUDA 安装程序设置的环境变量,相关构建配置可以引用它
CUDAToolkit_ROOTCMake 的 FindCUDAToolkit 模块使用的搜索提示

它们用于不同的配置环节,设置 CUDAToolkit_ROOT 不等于给 MSBuild 的 CudaToolkitDir 赋值。参见 FindCUDAToolkit 文档。

如何设置并重新配置?

以下示例假设 CUDA 13.2 安装在默认目录,请按实际安装位置修改。路径应指向 Toolkit 根目录,不要指向 bin 或 nvcc.exe。

在 Windows 命令提示符 cmd.exe 中执行:

set "CudaToolkitDir=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.2"
cmake -S . -B build --fresh

这里的引号包住整个赋值表达式,不会成为环境变量值的一部分。如果写成下面这样,双引号也会存进变量值:

set CudaToolkitDir="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.2"

如果使用 PowerShell,执行:

$env:CudaToolkitDir = 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.2'
cmake -S . -B build --fresh

设置变量后,必须在同一个终端中运行 CMake,才能让 CMake 及其启动的 MSBuild 继承该变量。--fresh 会删除构建目录中的 CMakeCache.txt 和关联的 CMakeFiles/,重新开始配置。参见 CMake 命令行文档。

原来的 CMakeLists.txt 可以保留:

cmake_minimum_required(VERSION 4.2 FATAL_ERROR)

project(hello LANGUAGES CUDA)

find_package(CUDAToolkit REQUIRED)

设置后仍然失败时检查什么?

先确认指定目录中有编译器。在 PowerShell 中执行:

Test-Path "$env:CudaToolkitDir\bin\nvcc.exe"
& "$env:CudaToolkitDir\bin\nvcc.exe" --version

如果路径正确,却仍然报同样的空目录错误,请查看完整日志中的 MSBuild 命令和报错指向的 .targets 文件,检查是否有项目配置覆盖了 CudaToolkitDir。还要确认 CUDA 的 Visual Studio 集成组件是否已安装,以及所用 MSVC 版本是否在 CUDA 13.2 的支持范围内。参见 CUDA 13.2 Windows 安装指南。

cmake -DCudaToolkitDir=... 只是设置一个 CMake 缓存变量,通常不会自动传递为同名 MSBuild 属性。遇到这里的错误,应先尝试上述环境变量方式。之后从其他终端或 IDE 构建时,也要确保相应进程能读取到该变量。

备注:内容仅供参考。