我正在尝试使用 NDK 工具链来构建一些用于 ARM 的本机库。我还在我的部分代码中使用了 ARMv7 NEON 内在函数。不幸的是,我在代码中的几个地方收到以下类型的错误:
internal compiler error: in write_builtin_type, at cp/mangle.c:1855
该错误似乎是通过使用中float32_t
定义的类型触发的
arm_neon.h
- 例如,我在使用std::vector<float32_t>
.
对于 Android ARM,单精度浮点类型是内部编译器内置类型的 typedef,而对于 Linaro Linux,例如只是 C/C++ float 的 typedef - 请参阅arm_neon.h
两种编译器的情况(我可以使用Linaro Linux 工具链没有任何问题)。
我还在 android NDK Google 小组中发现了一篇旧帖子,似乎描述了同样的问题,但不幸的是它没有提供任何解决方案: 一些旧帖子描述了相同的编译器崩溃
有人对如何克服上述问题有任何提示吗?是否有任何特殊原因使用内置编译器类型而不是像 Linaro 工具链那样的普通浮点数?如果我替换 typedef 我会导致不需要/未定义的行为吗?有谁知道 NDK 中包含的工具链是否基于 CodeSourcery 工具链,因为 CS 确实有问题,我们拥有的代码库在很多方面都破坏了它(就像信息一样,我知道我必须肯定地改变工具链) ?
我正在使用:
安卓 NDK 版本 r8
NDK 工具链 gcc (GCC) 4.4.3 - 按照 NDK 文档中的建议在 NDK 之外剥离
更新:
发现这个其他 SO question说明了几乎相同的问题......可怕的是它来自 2010 年。
更新 2:
替换 typedef 不是一种选择,因为它会完全破坏 NEON 内在功能。所有浮点内在函数都依赖于期望__builtin_neon_sf
(float32_t 的 typedef)类型作为其参数的内置编译器函数。