2、编译环境搭建:Linux/macOS/Windows 下编译 llama.cpp 的完整流程与常见坑
说实话,编译环境这块,我见过太多人卡在第一关了。明明代码没问题,就是跑不起来。说白了,llama.cpp 的编译本身不复杂,但不同平台下的坑确实不少。今天我就把三个主流系统下的完整流程走一遍,顺便聊聊我踩过的那些坑。
2.1 前置准备:你需要的工具链
不管你在哪个系统,核心依赖就这几样:
- C++ 编译器:支持 C++17 标准。GCC 9+、Clang 12+、MSVC 2022 都行。
- CMake:版本 3.20 以上。我个人习惯用 3.24,稳定。
- Git:拉取代码用,这个不用多说。
- Make 或 Ninja:构建工具,Ninja 更快一些。
嗯,这里要注意:如果你要用 GPU 加速,还得额外装 CUDA、ROCm 或 Metal 的 SDK。这个我们后面会细说。
2.2 Linux 下的编译流程
Linux 是我最常用的环境,也是坑最少的一个。先装依赖:
# Ubuntu/Debian
sudo apt update
sudo apt install build-essential cmake git
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
sudo yum install cmake git
然后拉代码、编译:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
mkdir build && cd build
cmake ..
make -j$(nproc)
搞定。就这么简单。但我要提醒你一件事——记得检查你的 GCC 版本。我曾经在 CentOS 7 上折腾了半天,发现默认的 GCC 4.8 根本不支持 C++17。后来升级到 devtoolset-9 才解决。
2.3 macOS 下的编译流程
macOS 用户要注意,Apple 的 Clang 和标准 Clang 有些差异。我建议直接用 Homebrew 装依赖:
brew install cmake git
# 如果你要 Metal 加速
brew install libomp
编译命令和 Linux 差不多:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
mkdir build && cd build
cmake ..
make -j$(sysctl -n hw.logicalcpu)
但有个坑——Apple Silicon 芯片的 Mac。我第一次在 M1 Mac 上编译时,直接报 "illegal hardware instruction"。后来发现是没加 -DCMAKE_OSX_ARCHITECTURES=arm64 参数。正确的做法是:
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 ..
make -j$(sysctl -n hw.logicalcpu)
2.4 Windows 下的编译流程
Windows 的坑最多,我一个个说。首先,别用 MinGW,老老实实用 Visual Studio 2022。为什么?因为 MinGW 的线程模型和 Windows 的 API 兼容性有问题,我吃过这个亏。
步骤:
- 安装 Visual Studio 2022,勾选「使用 C++ 的桌面开发」工作负载
- 安装 CMake(记得勾选「将 CMake 添加到系统 PATH」)
- 安装 Git for Windows
然后打开「Developer Command Prompt for VS 2022」:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
mkdir build && cd build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release
这里有个坑——路径不能有中文和空格。我之前把项目放在 "D:\我的项目\llama.cpp" 下,编译直接报错。改成纯英文路径就好了。
cmake .. -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded
2.5 启用硬件加速的编译选项
llama.cpp 支持多种后端加速。我整理了一张表,方便你对照:
| 加速后端 | CMake 选项 | 适用平台 | 备注 |
|---|---|---|---|
| CUDA | -DLLAMA_CUDA=ON | Linux/Windows | 需要 CUDA Toolkit 11.7+ |
| ROCm | -DLLAMA_HIPBLAS=ON | Linux | 需要 ROCm 5.4+ |
| Metal | -DLLAMA_METAL=ON | macOS | 仅 Apple Silicon |
| Vulkan | -DLLAMA_VULKAN=ON | 全平台 | 需要 Vulkan SDK |
| OpenBLAS | -DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS | 全平台 | CPU 加速 |
举个例子,在 Linux 上启用 CUDA 加速:
cmake -DLLAMA_CUDA=ON -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda ..
make -j$(nproc)
这里有个坑——CUDA 版本和 GCC 版本的兼容性。CUDA 11.7 最高支持 GCC 11,CUDA 12.x 支持 GCC 12。如果你用 GCC 13 编译 CUDA 代码,会报 "unsupported GNU version" 错误。解决办法是降级 GCC,或者用 -DCMAKE_CUDA_HOST_COMPILER 指定一个兼容的编译器。
2.6 常见编译错误与解决方案
我把这些年遇到的高频错误整理了一下:
- "fatal error: cuda_runtime.h: No such file or directory":CUDA 路径没配好。检查
CUDA_TOOLKIT_ROOT_DIR是否正确。 - "undefined reference to `cublasCreate_v2'":链接 CUDA 库时出问题。试试
-DLLAMA_CUDA=ON -DCUDAToolkit_ROOT=/usr/local/cuda。 - "error: 'std::filesystem' has not been declared":GCC 版本低于 8。升级到 9+ 即可。
- "Could NOT find OpenMP_C":缺少 OpenMP 库。Ubuntu 下
sudo apt install libomp-dev,macOS 下brew install libomp。
🔑 核心原则:遇到编译错误时,先看 CMake 的输出日志。它通常会告诉你哪个依赖没找到。别急着搜错误码,先检查环境变量和路径。
2.7 验证编译是否成功
编译完成后,跑一下内置的测试:
# 在 build 目录下
./bin/test-backend-ops
# 或者直接跑一个简单推理
./bin/main -m /path/to/model.gguf -p "Hello" -n 10
如果能看到输出,说明环境搭建成功了。我第一次在 Windows 上编译成功后,看到终端里蹦出 "Hello" 两个字,心里那块石头才算落地。
嗯,编译环境这块就这些。不同平台确实有些差异,但核心逻辑是一样的——装好依赖、配好路径、选对生成器。只要按这个流程走,基本不会出大问题。