目录
- [一、先搞懂 3 个核心概念(避坑的前提)](#一、先搞懂 3 个核心概念(避坑的前提))
-
- [1. `cuda-toolkit` ≠ `cudatoolkit`](#1.
cuda-toolkit≠cudatoolkit) - [2. Conda 里的 CUDA ≠ 显卡驱动](#2. Conda 里的 CUDA ≠ 显卡驱动)
- [3. `-c nvidia` 和 `nvidia/label/cuda-12.4.0` 不是一回事](#3.
-c nvidia和nvidia/label/cuda-12.4.0不是一回事)
- [1. `cuda-toolkit` ≠ `cudatoolkit`](#1.
- 二、完整安装步骤(全程可复现)
-
- [步骤 1:配置清华 Conda 镜像源(解决国内下载慢)](#步骤 1:配置清华 Conda 镜像源(解决国内下载慢))
- [步骤 2:确定安装的CUDA-Toolkit 版本](#步骤 2:确定安装的CUDA-Toolkit 版本)
- [步骤 3:创建独立的开发环境](#步骤 3:创建独立的开发环境)
- [步骤 4:安装 CUDA Toolkit 12.4(版本锁定版)](#步骤 4:安装 CUDA Toolkit 12.4(版本锁定版))
- [步骤 5:安装对应版本的 PyTorch](#步骤 5:安装对应版本的 PyTorch)
- [步骤 6:安装编译工具链](#步骤 6:安装编译工具链)
- [步骤 7:部署 LibTorch 2.6(CUDA 12.4 版本)](#步骤 7:部署 LibTorch 2.6(CUDA 12.4 版本))
- [三、LibTorch C++ 编译验证](#三、LibTorch C++ 编译验证)
-
- [1. 编写测试代码](#1. 编写测试代码)
- [2. 编写 CMakeLists.txt](#2. 编写 CMakeLists.txt)
- [3. 编写编译运行脚本](#3. 编写编译运行脚本)
- 四、高频踩坑与解决方案
-
- [1. 指定 12.4 版本,结果还是装了最新版](#1. 指定 12.4 版本,结果还是装了最新版)
- [2. 编译时报错 `cannot find -lnvToolsExt`](#2. 编译时报错
cannot find -lnvToolsExt) - [3. `nvcc -V` 显示的还是系统 CUDA 版本](#3.
nvcc -V显示的还是系统 CUDA 版本) - [4. PyTorch 正常,LibTorch 编译报 CUDA 版本不匹配](#4. PyTorch 正常,LibTorch 编译报 CUDA 版本不匹配)
- 五、最佳实践总结
做 CUDA C++ 开发、LibTorch 自定义算子、PyTorch C++ 部署时,由于在conda环境中安装的 CUDAToolkit 安装源不匹配导致后面使用 LibTorch 时一直出现错误,折腾了整整一周才算把问题解决,遂总结以下出现的问题和正确安装过程:
- 使用
conda install cuda-toolkit=12.4后 cmake 构建时一直识别不到cuda路径 - 明明执行了
conda install -c nvidia cuda-toolkit=12.4,结果装完一看是最新版 - 编译 LibTorch 项目时,疯狂报错找不到
nvToolsExt - PyTorch 跑起来没问题,C++ 编译就说 CUDA 版本不匹配
这些问题本质上都是对 conda 的 CUDA 包机制、频道优先级、依赖关系不理解导致的。本文结合实际踩坑经验,给出一套从镜像源配置到编译验证的完整流程,全程可复现,避开一些关键的环境坑。
一、先搞懂 3 个核心概念(避坑的前提)
很多人装环境踩坑,都是因为没分清几个长得很像的包和概念,先理清楚再动手。
1. cuda-toolkit ≠ cudatoolkit
cuda-toolkit(带横杠) :NVIDIA 官方发布的完整 CUDA 工具链,包含nvcc编译器、CUDA 头文件、运行库、调试工具等,是做 CUDA C++ 开发的必须包。cudatoolkit(不带横杠) :PyTorch 团队打包的 CUDA 运行时依赖,只有运行库,没有编译器,只能用来跑 PyTorch,不能用来编译 C++ 代码。
踩坑提醒:如果你的目标是编译 LibTorch/CUDA C++ 代码,一定要装带横杠的
cuda-toolkit。
2. Conda 里的 CUDA ≠ 显卡驱动
- 显卡驱动 :系统层面的驱动程序,决定了你的显卡最高能支持的 CUDA 版本,用
nvidia-smi查看。 - Conda 的 cuda-toolkit :conda 环境内的开发工具链,版本可以低于驱动支持的最高版本(向下兼容),用
nvcc -V查看。
简单说:驱动是上限,conda 里的是实际开发用的版本,两者不需要一致。
3. -c nvidia 和 nvidia/label/cuda-12.4.0 不是一回事
-c nvidia:NVIDIA 的主 conda 频道,永远优先放最新版本的 CUDA 包。只写版本号的话,conda 的 solver 经常会忽略版本约束,直接装最新版。nvidia/label/cuda-12.4.0:NVIDIA 的版本锁定标签频道,频道里的整套 CUDA 工具链都固定在 12.4 版本,是官方指定的安装旧版本 CUDA 的正确方式。
这就是"指定 12.4 却装成最新版"的核心原因:你用了主频道,却想固定旧版本。
二、完整安装步骤(全程可复现)
步骤 1:配置清华 Conda 镜像源(解决国内下载慢)
默认 conda 源在国外,下载速度极慢还容易中断,先配置国内镜像。执行以下命令添加清华源:
# 清华 Anaconda main 源(基础包)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
# 清华 Anaconda r 源(R语言相关包)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
# 清华 Anaconda msys2 源(Windows 相关工具)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2/
# 清华 conda-forge 源(社区包)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
配置完成后,建议开启严格频道优先级,避免不同源的包版本错乱:
conda config --set channel_priority strict
可以用以下命令查看已配置的源,确认添加成功:
conda config --show channels
注:如果部分镜像地址出现访问异常,可前往清华大学开源软件镜像站官网确认最新地址。
步骤 2:确定安装的CUDA-Toolkit 版本
这里假设你的开发硬件上已经安装了NVIDIA驱动,通过查看安装的驱动版本确定后面要安装CUDA-Toolkit
nvdia-smi
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.127.05 Driver Version: 550.127.05 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 4080 ... Off | 00000000:06:00.0 On | N/A |
| 0% 42C P8 13W / 295W | 106MiB / 16376MiB | 3% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 1822 G /usr/lib/xorg/Xorg 100MiB |
+-----------------------------------------------------------------------------------------+
可以看到,我的设备最高支持的CUDA版本为 12.4,这里我选择安装的 CUDA-Toolkit 为12.4
步骤 3:创建独立的开发环境
强烈建议新建一个干净的 conda 环境,不要在 base 环境里堆各种版本的依赖。这是避免"指定版本被强制升级"的关键------如果环境里已经有高版本的 pytorch-cuda,conda 会自动把 cuda-toolkit 拉高到匹配的版本。
# 创建名为 cuda_dev 的环境,指定 Python 3.11(兼容性最佳)
conda create -n cuda_dev python=3.11
# 激活环境
conda activate cuda_dev
步骤 4:安装 CUDA Toolkit 12.4(版本锁定版)
❌ 错误写法:
# 从 conda 官方下载的 CUDA-Toolkit 内容可能不全且环境变量设置不对,导致 cmake 构建时识别不到 cuda 路径
conda install cuda-toolkit=12.4
# 从NVIDIA官方下载的 CUDA-Toolkit 是正确的且可以识别,但是版本约束很弱,大概率装成最新版,这会与后面的 libtorch 不兼容
conda install -c nvidia cuda-toolkit=12.4
✅ 正确写法(官方推荐,版本绝对锁定):
# 官方下载时,一定要确保版本锁定,否则后面构建链接 libtorch 时会出错
conda install nvidia/label/cuda-12.4.0::cuda-toolkit -c nvidia/label/cuda-12.4.0 --yes
命令说明:
nvidia/label/cuda-12.4.0::cuda-toolkit:强制cuda-toolkit这个包必须来自 12.4 标签频道-c nvidia/label/cuda-12.4.0:将该标签频道加入本次安装的搜索源
安装完成后,验证版本是否正确:
nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Tue_Feb_27_16:19:38_PST_2024
Cuda compilation tools, release 12.4, V12.4.99
Build cuda_12.4.r12.4/compiler.33961263_0
输出中包含 release 12.4 就说明安装成功。一定要用 nvcc -V 验证,不要看 nvidia-smi。
步骤 5:安装对应版本的 PyTorch
安装和 CUDA 12.4 匹配的 PyTorch 套件,注意 pytorch-cuda 的版本必须和 cuda-toolkit 对齐:
conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia
踩坑提醒:不要省略
pytorch-cuda=12.4的版本号,也不要写更高的版本,否则会自动升级 CUDA 工具链,之前的版本锁定就失效了。
验证 PyTorch 的 CUDA 可用性:
python -c "import torch; print('CUDA可用:', torch.cuda.is_available()); print('CUDA版本:', torch.version.cuda)"
输出 True 且版本为 12.4,即为正常。
步骤 6:安装编译工具链
LibTorch C++ 项目需要 CMake 和构建工具,直接在 conda 环境内安装即可:
conda install cmake ninja make -y
ninja:比传统make更快的构建工具,推荐搭配 CMake 使用。
步骤 7:部署 LibTorch 2.6(CUDA 12.4 版本)
-
根据自己安装的 CUDA-Toolkit 版本,从 PyTorch 官网下载对应版本的 LibTorch 包:
libtorch-cxx11-abi-shared-with-deps-2.6.0+cu124.zip,链接:https://download.pytorch.org/libtorch/cu124/libtorch-cxx11-abi-shared-with-deps-2.6.0%2Bcu124.zip- 注意选对:cxx11 ABI、shared 版本、带依赖、CUDA 12.4
-
解压到你创建的环境目录下,我的环境路径时:/anaconda3/envs/cuda_dev/
unzip libtorch-cxx11-abi-shared-with-deps-2.6.0+cu124.zip
解压后会得到 libtorch 文件夹,内含 include、lib、share 等目录。
三、LibTorch C++ 编译验证
环境装完好不好用,跑一个最小测试项目就知道。
1. 编写测试代码
新建 main.cpp:
#include <torch/torch.h>
#include <iostream>
int main() {
// 创建随机 Tensor 并移到 GPU
torch::Tensor tensor = torch::rand({2, 3}).cuda();
std::cout << "GPU 上的 Tensor:\n" << tensor << std::endl;
// 打印 CUDA 状态
std::cout << "\nCUDA 是否可用: " << torch::cuda::is_available() << std::endl;
std::cout << "CUDA 设备数量: " << torch::cuda::device_count() << std::endl;
return 0;
}
2. 编写 CMakeLists.txt
重点是强制 CMake 使用 conda 环境内的 CUDA,避免它自动找到系统里的其他 CUDA 版本。
cmake_minimum_required(VERSION 3.15)
# 项目名称、版本、语言
project(HelloWorld
VERSION 1.0.0
DESCRIPTION "My first CMake project"
LANGUAGES CXX
)
find_package(CUDA REQUIRED)
find_package(Torch REQUIRED)
message("------------------------------------------------------------")
# 检查 CUDA 相关路径是否正确
message(STATUS "CUDA Found: ${CUDA_FOUND}")
message(STATUS "CUDA Toolkit Root: ${CUDA_TOOLKIT_ROOT_DIR}")
message(STATUS "CUDA Include Dir: ${CUDA_INCLUDE_DIRS}")
message(STATUS "CUDA Library Dir: ${CUDA_LIBRARIES}")
message(STATUS "CUDA Runtime Library: ${CUDA_CUDART_LIBRARY}")
message(STATUS "CUDA nvcc Executable: ${CUDA_NVCC_EXECUTABLE}")
# 检测项目相关路径是否正确
message(STATUS "PROJECT_NAME:${PROJECT_NAME}") # "MyProject"
message(STATUS "PROJECT_VERSION:${PROJECT_VERSION}") # "1.2.3"
message(STATUS "PROJECT_VERSION_MAJOR:${PROJECT_VERSION_MAJOR}") # 1
message(STATUS "PROJECT_VERSION_MINOR:${PROJECT_VERSION_MINOR}") # 2
message(STATUS "PROJECT_VERSION_PATCH:${PROJECT_VERSION_PATCH}") # 3
message(STATUS "PROJECT_SOURCE_DIR:${PROJECT_SOURCE_DIR}") # 项目根目录
message(STATUS "PROJECT_BINARY_DIR:${PROJECT_BINARY_DIR}") # 构建目录
# 检查 LibTorch 相关路径是否正确
message(STATUS "TORCH_INCLUDE_DIRS: ${TORCH_INCLUDE_DIRS}")
message(STATUS "TORCH_LIBRARIES: ${TORCH_LIBRARIES}")
message("------------------------------------------------------------")
# 创建可执行文件目标
add_executable(demo main.cpp)
# 链接libtorch库
target_link_libraries(demo PRIVATE ${TORCH_LIBRARIES})
# C++17是libtorch强制要求
target_compile_features(demo PRIVATE cxx_std_17)
# Linux下:libtorch需要RTTI、异常开关,默认一般打开
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
3. 编写编译运行脚本
bash
# 新建 build 目录
rm -rf build
mkdir build
cd build
cmake .. \
-DCMAKE_PREFIX_PATH=/data/anaconda3/envs/cuda_dev/libtorch
make -j$(nproc)
然后运行编译好的可执行程序
bash
./build/demo
GPU 上的 Tensor:
0.8165 0.0179 0.9322
0.4121 0.1442 0.9533
[ CUDAFloatType{2,3} ]
CUDA 是否可用: 1
CUDA 设备数量: 1
正常运行会输出 2x3 的随机张量,以及 CUDA 可用状态,说明整个开发环境配置完成。
四、高频踩坑与解决方案
1. 指定 12.4 版本,结果还是装了最新版
- 原因 :用了
-c nvidia主频道,solver 优先最新版;或者环境里已有高版本pytorch-cuda依赖 - 解决 :改用
nvidia/label/cuda-12.4.0标签频道;新建干净环境,先装 CUDA,再装 PyTorch
2. 编译时报错 cannot find -lnvToolsExt
- 原因 :用了 conda-forge 源的
cuda-toolkit,组件阉割,缺少 nvToolsExt 库 - 解决 :卸载旧包,用 NVIDIA 官方 label 频道的
cuda-toolkit重新安装
3. nvcc -V 显示的还是系统 CUDA 版本
- 原因:conda 环境变量未生效,或者系统 PATH 优先级高于 conda
- 解决 :重新执行
conda activate cuda_dev;检查echo $PATH,确保 conda 环境的bin目录在最前面
4. PyTorch 正常,LibTorch 编译报 CUDA 版本不匹配
- 原因:CMake 自动找到了系统里的 CUDA,没用到 conda 环境内的
- 解决 :在
CMakeLists.txt开头显式指定CMAKE_CUDA_COMPILER和CUDAToolkit_ROOT为 conda 环境路径
五、最佳实践总结
- 环境隔离:每个 CUDA 版本对应一个独立 conda 环境,不要在 base 环境混用
- 版本锁定 :固定 CUDA 版本一律用
nvidia/label/cuda-x.x.x标签频道,不要只写版本号 - 安装顺序:先装 CUDA Toolkit,再装 PyTorch,最后装其他依赖,反向容易导致版本升级
- 显式指定:C++ 编译时显式指定 CUDA 路径,不要依赖 CMake 的自动查找
- 国内镜像:优先配置国内镜像源,提升下载速度和稳定性
这套流程亲测可以稳定复现 CUDA 12.4 + LibTorch 2.6 的开发环境,解决了版本漂移、组件缺失、编译链接错误等常见问题。如果是做 LibTorch 扩展、CUDA 自定义算子开发,这个环境可以直接作为基础环境使用。