我试图使用NDK工具链来构建一些本机库,我有ARM。 我在我的部分代码中也使用了ARMv7 NEON内在函数。不幸的是我得到了 以下类型的错误在我的代码的几个地方:Android NDK工具链内部编译器错误
internal compiler error: in write_builtin_type, at cp/mangle.c:1855
的错误似乎是由使用在 arm_neon.h
定义的float32_t
型触发 - 例如使用std::vector<float32_t>
时,编译器崩溃。
如果是Android ARM的单精度浮点类型是用于 内部编译器内建类型一个typedef而对于Linaro的Linux的例子只是一个的C/C++浮子的typedef - 见arm_neon.h
在两个编译器的情况下(我可以用Linaro Linux工具链构建相同的 源代码而不会有任何问题)。
我还发现了一个旧的文章在Android NDK谷歌组,似乎说明了同样的问题,但遗憾的是它没有提出任何解决办法: Some old post describing the same compiler crash
有没有人对如何克服上述问题的任何提示? 是否有任何特殊原因使用内置编译器类型,而不是像Linaro工具链那样的正常浮点数? 如果我替换typedef会导致不需要的/未定义的行为? 有没有人知道基于CodeSourcery工具链的NDK中是否包含工具链,因为CS的确是bug,而且我们的代码库已经以多种方式破坏了它(就像信息一样,我知道我必须改变工具链)?
我使用:
的Android NDK版本R8
NDK工具链GCC(海湾合作委员会)4.4.3 - 剥去外面NDK的NDK文档中建议
更新:
发现this other SO question示出几乎相同的问题......可怕的是,它从2010年
更新2是:
更换的typedef是不是因为这将彻底打破NEON内在功能的选项。所有的浮点内部函数都依赖内置的编译器函数,这些编译器函数将__builtin_neon_sf
(float32_t的typedef)类型作为它们的参数。
这看起来不错,但不幸的是我被绑定到“官方”NDK。在一个侧面说明我也尝试了Linaro的交叉工具链,版本4.7.1,不幸的是,在一些奇怪的方式下,我仍然没有找到解决方案。 – celavek