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 ツールチェーンの場合のように、通常の float ではなく、組み込みのコンパイラ タイプが使用される特別な理由はありますか? typedef を置き換えると、望ましくない/未定義の動作が発生しますか? ツールチェーンが CodeSourcery ツールチェーンに基づいて NDK に含まれているかどうかは誰にもわかりません。CS のものは本当にバグが多く、私たちが持っているコード ベースが多くの点でそれを壊しているためです (ツールチェーンを確実に変更する必要があることを知るための情報と同じです)。 ?
私は使用しています:
Android NDK バージョン r8
NDK ツールチェーン gcc (GCC) 4.4.3 - NDK のドキュメントでアドバイスされているように、NDK の外部でストリップされています。
アップデート:
ほぼ同じ問題を説明するこの他の SO の質問が見つかりました...恐ろしいのは、それが 2010 年のものであることです。
更新 2:
typedef を置き換えることは、NEON 組み込み機能を完全に破壊するため、オプションではありません。__builtin_neon_sf
すべての浮動小数点組み込み関数は、パラメーターとして (float32_t の typedef) 型を期待する組み込みコンパイラー関数に依存しています。