我正在尝试使用 NDK 工具链为 ARM 构建一些 native 库。 我还在我的部分代码中使用了 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 例如只是一个 typedef
C/C++ float - 参见 arm_neon.h
对于两个编译器(我可以构建相同的
源与 Linaro Linux 工具链没有任何问题)。
我还在 android NDK Google 组中找到了一篇旧帖子,似乎描述了同样的问题,但不幸的是它没有提供任何解决方案: Some old post describing the same compiler crash
有没有人对如何克服上述问题有任何提示? 是否有任何特殊原因使用内置编译器类型而不是像 Linaro 工具链那样的普通 float ? 如果我替换 typedef 会导致不需要的/未定义的行为吗? 有谁知道 NDK 中包含的工具链是否基于 CodeSourcery 工具链,因为 CS 确实有问题而且我们的代码库在很多方面都破坏了它(就像信息一样,所以我知道我必须肯定地更改工具链) ?
我正在使用:
Android NDK 版本 r8
NDK 工具链 gcc (GCC) 4.4.3 - 按照 NDK 文档中的建议从 NDK 中剥离
更新:
找到 this other SO question这说明了几乎相同的问题……可怕的是它是从 2010 年开始的。
更新 2:
替换 typedef 不是一个选项,因为它会完全破坏 NEON 内部函数。所有浮点内在函数都依赖于期望 __builtin_neon_sf
的内置编译器函数(float32_t 的 typedef)类型作为它们的参数。
最佳答案
你可以试试Crystax NDK作者:Dmitry Moskalchuk。
关于Android NDK 工具链内部编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11033543/