本工具包用于在 Windows 7 系统上编译 llama.cpp。由于 llama.cpp 主线依赖的 cpp-httplib 库从 2025.9 月起不再支持 Win8 以下系统,需要对源码做兼容性修改后才能编译。
llama-bianyi/
├── build-win7.bat # 一键编译脚本(双击运行)
├── start-server.bat # llama-server 启动脚本
├── README.md # 本说明文档
├── tools/ # 编译工具(自动下载)
│ ├── w64devkit/ # MinGW 编译器套件
│ └── cmake/ # CMake 构建工具
└── llama.cpp/ # 源码(自动 clone)
└── bin/ # 编译输出目录
- 双击运行
build-win7.bat - 等待自动下载工具和源码(首次需要网络)
- 等待编译完成(约 15-30 分钟)
- 编译产物在
llama.cpp/bin/目录下
启动服务:
start-server.bat "D:\models\qwen2.5-7b-q4_k_m.gguf"
- 操作系统:Windows 7 SP1 及以上
- 网络:首次编译需要联网下载工具和源码
- Git:需要已安装 Git(用于 clone 源码)
- 磁盘空间:约 2GB(工具 + 源码 + 编译产物)
编译脚本会自动应用以下 3 处修改:
文件:llama.cpp/ggml/include/ggml.h、llama.cpp/common/common.h
// 修改前
#define _WIN32_WINNT 0x0A00 // Windows 10
// 修改后
#define _WIN32_WINNT 0x0601 // Windows 7文件:llama.cpp/vendor/cpp-httplib/httplib.h
删除以下代码块:
#ifdef _WIN32
#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0A00
#error "cpp-httplib doesn't support Windows 8 or lower."
#endif
#endif文件:llama.cpp/vendor/cpp-httplib/httplib.cpp
| Win8+ API | Win7 替代 API |
|---|---|
CreateFile2() |
CreateFileW() |
CreateFileMappingFromApp() |
CreateFileMappingW() |
MapViewOfFileFromApp() |
MapViewOfFile() |
这是编译过程中最容易踩坑的地方,直接影响推理速度。
| 指令集 | 作用 | 对 llama.cpp 的影响 |
|---|---|---|
| AVX | 256 位向量运算 | 基础加速,必须开启 |
| AVX2 | 整数向量运算 | 矩阵乘法核心加速,不开会慢 3 倍 |
| F16C | 半精度浮点转换 | llama.cpp 大量使用 FP16,不开会用软件模拟 |
| FMA | 融合乘加运算 | 一条指令完成 a*b+c,矩阵运算密集使用 |
| BMI2 | 位操作指令 | 量化/反量化操作加速 |
CMake 配置时会自动添加 -march=native,意思是编译器自动检测当前 CPU 支持的所有指令集并全部启用。所以:
- 在编译机器上运行 → 自动获得最佳优化
- 拷贝到其他机器运行 → 如果 CPU 不支持某些指令集会崩溃
如果你需要编译通用版本(在多台机器上运行),需要关闭 -march=native,改为手动指定指令集。
在 AMD Ryzen 7 5800H 上测试同一模型:
| 编译配置 | 推理速度 | 差距原因 |
|---|---|---|
| 仅 AVX(无 AVX2) | ~5 t/s | 缺少整数向量加速 |
| AVX + AVX2 | ~10 t/s | 缺少 F16C/FMA |
| AVX + AVX2 + F16C + FMA + BMI2 | ~15 t/s | 完整优化 |
# Windows(PowerShell)
Get-CimInstance -ClassName Win32_Processor | Select-Object Name
# 然后到 https://en.wikipedia.org/wiki/CPUs_lookup 查看该 CPU 支持的指令集cmake . -G "MinGW Makefiles" \
-DLLAMA_CURL=OFF \ # 禁用 HTTP 客户端(Win7 没有 libcurl)
-DCMAKE_CXX_COMPILER=g++ \ # 使用 MinGW 的 g++
-DCMAKE_C_COMPILER=gcc \ # 使用 MinGW 的 gcc
-DLLAMA_BUILD_TESTS=OFF \ # 不编译测试程序(节省时间)
-DGGML_AVX=ON \ # 启用 AVX
-DGGML_AVX2=ON \ # 启用 AVX2(重要!)
-DGGML_F16C=ON \ # 启用 F16C(重要!)
-DGGML_FMA=ON \ # 启用 FMA(重要!)
-DGGML_BMI2=ON # 启用 BMI2编译优化只是一方面,运行时参数也影响速度:
| 参数 | 说明 | 建议值 |
|---|---|---|
-t |
线程数 | 设为物理核心数(如 5800H 用 -t 8) |
-c |
上下文长度 | 越大越慢,按需设置(默认 2048) |
-b |
批处理大小 | 可以试 -b 512 或 -b 1024 |
-ngl |
GPU 层数 | 有独显可设 -ngl 99 卸载到 GPU |
--reasoning |
思考模式 | off 关闭可减少输出 token |
| 对比项 | llama.cpp | llamafile |
|---|---|---|
| 编译方式 | 需要本地编译 | 单个可执行文件,免安装 |
| CPU 指令集 | 编译时固定 | 运行时自动检测 |
| Win7 支持 | 需要打补丁 | 原生支持 |
| 自定义程度 | 可修改源码 | 不可修改 |
| 性能 | 取决于编译参数 | 自动选择最优指令集 |
如果自动脚本不生效,可按以下步骤手动操作:
下载并解压:
git clone --depth 1 https://github.com/ggml-org/llama.cpp.git按上述 3 处修改源码。
# 设置 PATH(根据实际路径调整)
export PATH="/path/to/w64devkit/bin:/path/to/cmake/bin:$PATH"
# 配置
cd llama.cpp
cmake . -G "MinGW Makefiles" \
-DLLAMA_CURL=OFF \
-DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_C_COMPILER=gcc \
-DLLAMA_BUILD_TESTS=OFF \
-DGGML_AVX=ON \
-DGGML_AVX2=ON \
-DGGML_F16C=ON \
-DGGML_FMA=ON \
-DGGML_BMI2=ON
# 编译(单线程)
cmake --build . --config Release -j 1默认编译最新版。如需指定版本:
cd llama.cpp
git fetch --tags
git checkout b9095 # 替换为目标版本号然后重新执行编译步骤。
A: PATH 中没有包含 w64devkit/bin 目录。确保 cmake 运行时能找到 mingw32-make.exe。
A: 多试几次,或使用代理。也可以手动下载 zip 解压到 llama-bianyi/llama.cpp/ 目录。
A: 确认 _WIN32_WINNT 已改为 0x0601,且 httplib.cpp 中的 3 个 API 已替换。
A: 需要额外安装 CUDA Toolkit,cmake 时加参数 -DGGML_CUDA=ON。
A: 大概率是 AVX2 没有开启。检查 cmake 编译输出中是否有 -march=native,或手动加 -DGGML_AVX2=ON -DGGML_F16C=ON -DGGML_FMA=ON。
A: 脚本会自动重命名。如果失败,手动将目录重命名为 cmake,或更新 PATH 指向实际目录名。