【摘要】
最近在 WSL 2 环境下编译 llama.cpp 并启用 CUDA 加速时,遇到了一系列连环报错:从 WSL 服务崩溃 (Wsl/Service/E_UNEXPECTED),到 GCC 与 CUDA 版本不兼容导致的 _Float64 类型未定义错误。本文完整记录了从环境修复、版本统一、编译器降级到最终成功编译的全过程。如果你也正被这些问题困扰,希望这篇实战记录能帮你节省大量时间。


一、问题背景

我的环境配置:

  • 硬件:NVIDIA GeForce RTX 2080 Ti
  • Windows 驱动:536.23(支持 CUDA 12.2)
  • WSL 发行版:Ubuntu 24.04
  • 目标:编译 llama.cpp 并启用 CUDA 后端

一开始一切顺利,直到执行 cmake .. -DGGML_CUDA=ON 后,噩梦开始了。

在这里插入图片描述

在这里插入图片描述

二、踩坑全记录

坑 1:WSL 服务崩溃

$ wsl
灾难性故障
错误代码: Wsl/Service/E_UNEXPECTED

在这里插入图片描述

原因分析:WSL 后台服务卡死或组件损坏。

解决方案

# 以管理员身份在 PowerShell 中执行
wsl --shutdown
wsl --update   # 修复 WSL 组件

在这里插入图片描述

如果问题依旧,可以尝试修复注册表权限或运行 DISM /Online /Cleanup-Image /RestoreHealth

坑 2:CUDA 版本不一致

$ nvidia-smi   # 显示 CUDA Version: 12.2
$ nvcc --version  # 显示 release 12.9

原因分析:驱动支持的最高 CUDA 版本是 12.2,但 nvcc 是 12.9,版本不匹配会导致编译出的二进制可能无法执行。

解决方案:降级 CUDA 工具包到 12.2,或升级 Windows 驱动。我选择了降级:

# 卸载旧版本
sudo apt remove --purge nvidia-cuda-toolkit
# 安装 CUDA 12.2(从 NVIDIA 官网下载)
wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
sudo sh cuda_12.2.0_535.54.03_linux.run --toolkit

坑 3:GCC 版本不兼容

# error: #error -- unsupported GNU version! gcc versions later than 12 are not supported!

原因分析:我的 GCC 是 13.3,而 CUDA 12.2 官方只支持到 GCC 12。

解决方案:降级到 GCC 10(最稳妥):

sudo apt install gcc-10 g++-10

gcc --version

在这里插入图片描述
在这里插入图片描述

坑 4:nvcc 仍调用系统默认 GCC

即使设置了 CC=/usr/bin/gcc-10nvcc 仍然调用的是 gcc 命令(指向 GCC 13)。

解决方案:创建软链接强制使用 GCC 10:

sudo ln -sf /usr/bin/gcc-10 /usr/bin/gcc
sudo ln -sf /usr/bin/g++-10 /usr/bin/g++

在这里插入图片描述

坑 5:_Float64 类型未定义

编译过程中出现大量类似错误:

error: ‘_Float64’ does not name a type; did you mean ‘_Float16’?
error: ‘_Float128’ was not declared in this scope

原因分析:这是 GCC 13 + CUDA 12.9 + glibc 2.40 头文件冲突的连锁反应。降级到 GCC 10 后该问题自动消失。

三、最终成功配置

# 检查环境
$ gcc --version
gcc (Ubuntu 10.5.0-4ubuntu2.1) 10.5.0

$ nvcc --version
Cuda compilation tools, release 12.2, V12.2.91

$ nvidia-smi | grep CUDA
CUDA Version: 12.2

在这里插入图片描述

四、重新编译

cd /mnt/d/git_projects/llama.cpp/build
rm -rf *
cmake .. -DGGML_CUDA=ON
make -j4

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

最终输出:

[100%] Built target llama-server
[100%] Built target llama-cli

在这里插入图片描述
✅ 编译成功!

五、经验总结

问题 解决方案
WSL 服务崩溃 wsl --shutdown + wsl --update
CUDA 版本不匹配 统一到驱动支持的版本(12.2)
GCC 版本过高 降级到 CUDA 官方支持的版本(GCC 10)
nvcc 编译器路径错误 创建 /usr/bin/gcc 软链接指向正确版本

六、避坑建议

  1. 版本统一是王道nvcc --versionnvidia-smi 显示的 CUDA 版本必须一致或前者≤后者。
  2. 不要追新 GCC:CUDA 对宿主编译器版本要求苛刻,GCC 10 是万金油选择。
  3. 软链接优于环境变量nvcc 硬编码调用 gcc,修改 PATHCC 不一定有效。
  4. 遇到 _Float64 错误:99% 是 GCC 版本问题,降级即可。

写在最后

编译一个开源项目,踩坑是常态,但每一次排错都是成长。希望这篇记录能帮你少走弯路。如果你有更好的解决方案,欢迎评论区交流!

祝大家编码顺利,永不报错! 🚀


本文标签: #WSL #CUDA #llama.cpp


本文为原创内容,版权归作者所有,转载需注明出处。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐