快速结论:该报错发生在 32 位 ARM(armv7a)环境下使用 GCC 编译 llama.cpp 且启用 NEON 优化时,编译器无法识别 __fp16 类型。优先排查编译时是否添加了 -mfp16-format=ieee 编译选项,否则代码会因缺少 IEEE 半精度格式声明而回退到非 NEON 路径。
适用环境:Linux 操作系统、llama.cpp(commit 74ade52741203e5c8f81eaf06a96cb1cfe15f2a3)、CPU 后端(GGML backends: CPU)、armv7a 架构、GCC 编译器。
最快修复方案:暂无确认的一步修复方案。Issue 中提供的补丁(将 __ARM_NEON 条件改为 __ARM_NEON && __ARM_FP16_FORMAT_IEEE)已被社区成员验证有效,但尚未合并到主线,需要手动应用。
注意事项:该补丁在测试中通过了 GCC/Clang 以及启用/禁用 NEON 优化的 ARM 编译,但作者本人表示尚未进行原生编译验证。在 64 位 ARM(AArch64)环境下通常不会触发此问题,因为 __fp16 默认支持。
问题场景
用户在 Linux 上编译 Firefox Nightly(版本 155.0),构建过程中在 third_party/llama.cpp 的 NEON 编译阶段触发该错误。这是 Firefox 将 llama.cpp 作为第三方组件集成编译的场景,针对 32 位 ARM(armv7a)架构使用 GCC 编译器,启用了 NEON 优化路径。
报错原文
.deps/gmp-fake-openh264.o.pp -fdiagnostics-color /home/tmp/portage/portage/www-client/firefox-155.0/work/firefox-155.0/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp
0:52.09 E /home/tmp/portage/portage/www-client/firefox-155.0/work/firefox-155.0/third_party/llama.cpp/ggml/src/ggml-cpu/simd-mappings.h:45:9: error: unknown type name '__fp16'; did you mean '__bf16'?
0:52.09 E 45 | __fp16 tmp;
0:52.10 E | ^~~~~~
0:52.10 E | __bf16
0:52.10 E /home/tmp/portage/portage/www-client/firefox-155.0/work/firefox-155.0/third_party/llama.cpp/ggml/src/ggml-cpu/simd-mappings.h:52:9: error: unknown type name '__fp16'; did you mean '__bf16'?
0:52.10 E 52 | __fp16 tmp = f;
0:52.11 E | ^~~~~~
0:52.11 E | __bf16
原因分析
可能原因:simd-mappings.h 中用于启用 FP16 到 FP32 转换的预编译宏条件仅为 __ARM_NEON,但在 32 位 ARM 架构上,NEON 扩展的可用性并不等同于 __fp16 类型的可用性。GCC 在 32 位 ARM 上要求通过 -mfp16-format=ieee 显式指定 IEEE 半精度格式,否则编译器不会预定义 __fp16 类型。AArch64(64 位 ARM)默认支持该类型,而 armv7a 需要额外的编译选项,这就导致了条件宏误判、代码进入 NEON 路径但编译器无法识别 __fp16 类型的编译失败。
环境排查
- 确认目标架构是否为 32 位 ARM(armv7a)——AArch64 环境通常不会触发此问题。
- 确认编译器类型为 GCC(Clang 对
__fp16的处理可能有差异,需单独验证)。 - 检查编译命令中是否带有
-mfp16-format=ieee选项;缺失时可能导致该错误。 - 确认 llama.cpp 版本(Issue 报告时的 commit: 74ade52741203e5c8f81eaf06a96cb1cfe15f2a3)。
- 检查是否启用了 NEON 优化(
-mfpu=neon或类似选项)——非 NEON 构建可正常工作。
解决步骤
- 备份原始文件:
cp ggml/src/ggml-cpu/simd-mappings.h ggml/src/ggml-cpu/simd-mappings.h.bak - 编辑
ggml/src/ggml-cpu/simd-mappings.h,找到条件宏定义行(约第 30 行附近)。 - 将
#if defined(__ARM_NEON)修改为#if defined(__ARM_NEON) && defined(__ARM_FP16_FORMAT_IEEE),同时修改对应的注释说明,使其反映 32 位 ARM 需要-mfp16-format=ieee才能启用__fp16的事实。 - 重新编译项目。Issue 中测试结果表明此补丁在 GCC/Clang、启用或禁用 NEON 的 ARM 编译中均通过验证。
验证方法
重新运行编译命令(如 gmake 或 Firefox 的构建命令),确认 simd-mappings.h 不再产生 unknown type name '__fp16' 错误。若编译完成后能正常生成二进制文件,且相关测试用例(如 FP16 转换测试)通过,说明修复有效。可先行使用交叉编译工具链进行快速验证,再执行完整的原生编译测试。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


