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 的说明。
这三个名称的用途不同:
| 名称 | 用途 |
|---|---|
CudaToolkitDir | MSBuild 使用的 CUDA Toolkit 路径属性,可通过同名环境变量提供 |
CUDA_PATH | CUDA 安装程序设置的环境变量,相关构建配置可以引用它 |
CUDAToolkit_ROOT | CMake 的 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 构建时,也要确保相应进程能读取到该变量。
备注:内容仅供参考。
