
Compile bug: shaderc v2025.2 causes vulkan compilation failure
快速结论:该报错发生在使用 llama.cpp 编译 Vulkan 后端时,当构建依赖 shaderc 版本为 v2025.2 时会出现编译失败(提示 bfloat16 相关错误)。优先排查 shaderc 版本,并在可能的情况下将其回退到 v2024.0,或应用禁用 bfloat16 着色器优化标记的补丁。
问题场景
用户在 Linux 系统上编译 llama.cpp 的 Vulkan 后端时触发问题。使用 Nix 构建系统(`nix flake update && nix build ‘.#vulkan’`)或其他构建系统均可复现。当 shaderc 版本为 v2025.2(nixos-unstable 中的最新版本)时构建失败,而 shaderc v2024.0 可正常编译。
报错原文
/build/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp:226: error: 'GL_EXT_bfloat16' not declared in this scope
完整编译日志中会显示一连串 bfloat16 相关错误,例如:
error: 'GL_EXT_bfloat16' not declared in this scope
原因分析
可能原因:shaderc v2025.2 在 nixpkgs 中的依赖关系(glslang、SPIRV-Tools、SPIRV-Headers)版本组合不正确。具体来说,nixpkgs 中的 shaderc 包定义引用了 shaderc v2025.1 的依赖提交哈希,而非 v2025.2 的正确依赖(google/shaderc 030484b)。旧版本的 SPIRV-Headers 可能包含不兼容的 bfloat16 定义,导致编译脚本的 GL_EXT_bfloat16 支持测试产生假阳性,后续实际生成 Vulkan 着色器时失败。
另一可能原因是 shaderc v2025.2 自身对 bfloat16 着色器的优化处理(spirv-opt)存在兼容性问题。移除 -O 优化标志(禁用 spirv-opt)可以让编译通过,且不影响功能正确性。
环境排查
- shaderc 版本:确认版本是否为 v2025.2,可运行
glslc --version查看。注意:如果输出中显示奇怪的日期(如 1980-01-01),通常表示依赖版本组合可能存在问题。 - 构建系统:确认是否使用 Nix 或其他构建系统(如 CMake)。注意 nix flake.lock 中引用的 nixpkgs 分支(nixos-unstable 可能包含有问题的 shaderc)。
- 上游依赖提交哈希:如果使用 Nix,检查 shaderc 包的 glslang、SPIRV-Tools、SPIRV-Headers 的修订哈希是否与 shaderc v2025.2 的正确依赖提交一致。
- llama.cpp 版本:确认 Git commit,本 Issue 测试于
7aeee88cfe9c0434eac722b0f7c21404f48758a5。
解决步骤
- (优先尝试)禁用 bfloat16 着色器的优化标志
修改ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp第 226 行,移除-O参数。此方法由 Issue 作者验证编译通过且功能正常(llama-bench 可运行)。对应 Pull Request:#15352。 - 回退 shaderc 版本到 v2024.0
在 Nix 构建中,覆盖 shaderc 包为来自 nixos-25.05 的 v2024.0 版本。参见 Issue 中提供的diff示例(添加stable-nixpkgs输入源,将shaderc指向nixos-25.05的版本)。 - 使用 nixpkgs 中已应用补丁的 llama-cpp 包
Nixpkgs 已通过 PR #432350 应用了禁用 bfloat16 着色器扩展支持测试的补丁(disable_bfloat16.patch)。可等待该 PR 合并后升级 nixpkgs。 - 修复 shaderc 包依赖(Nix 用户)
手动修改 nixpkgs 中 shaderc 包的依赖提交哈希,使 glslang、SPIRV-Tools、SPIRV-Headers 与 shaderc v2025.2 的正确依赖提交一致。
验证方法
运行 nix build '.#vulkan' 或对应的编译命令,确认不再出现 GL_EXT_bfloat16 not declared 错误。完成后可以运行 llama-bench 或加载模型推理,验证功能正常。
参考来源
相关链接:NixOS/nixpkgs #409284、NixOS/nixpkgs #432350、ggml-org/llama.cpp PR #15352、shaderc v2025.2 正确依赖提交:google/shaderc 030484b、ggml(whisper.cpp 中类似问题的根源)



