web-dev-qa-db-ja.com

Android NDKはどのコンパイラを使用しますか?

ARMAndroidアプリケーション用のNEONベースのコードを書いていますが、特定のコンパイラフラグが認識されないことに苦労していました。後でそれらのサポートに気づきました。フラグはごく最近追加されたばかりで、私のGCCバージョンは古いです。私はWindowsですべてを行っており、Cygwinが提供するバージョンによって制限されています。これが私の質問です。GCC4.6.0をビルドする前に私のWindowsマシンでCygwinをそのようにしていますが、それは私のために機能しますか、それともNDKは独自のバージョンのGCCを使用しますが、アップグレードはまったく影響しませんか? ?

21
Phonon

NDK自体は、arm-eabi-gccコンパイラー上に構築されたカスタマイズされたクロスコンパイラーを呼び出します。 ARM命令セットをサポートするbog-standardGCC実装を使用してカスタムツールチェーンを作成する人々の例がありますが、それは私のリーグからは程遠いです。私が過去に読んだもののほとんどはネイティブコードをコンパイルするためにNDKに含まれているツールチェーンを使用して常に議論されます。

当然の結果:不平を言い、独自のツールチェーンを作成しなければならなかった人々のほとんどは、NDKツールチェーンのコンパイラの(想定される)サブパーC++サポートに腹を立てた人々でした。一部の記事が古く、Androidが非常に急速に変化するため、これについて話すことはできません。また、あまり頻繁に出てくるような意見でもありません。

11
Doug Stephen

NDK r8dに関しては、2つの方法で変更できます( Andriod ndk を参照)。

  • Ndk-buildの場合、NDK_TOOLCHAIN_VERSION = 4.7変数をエクスポートするか、Application.mkに追加します。
  • スタンドアロンビルドの場合、make-standalone-toolchain.shに--toolchain =オプションを追加します--toolchain=arm-linux-androideabi-4.7

デフォルトのコンパイラはndk/build/core/setup-toolchain.mkに設定されています(NDK_TOOLCHAINおよびNDK_TOOLCHAIN_VERSIONを参照)

18
kalad

NDK 11(2016年3月)の時点で、GCCは廃止され、clangが優先されます

公式の改訂履歴について言及: https://developer.Android.com/ndk/downloads/revision_history.html

コンパイラを切り替える方法は、次の場所で尋ねられます。

そして、あなたはそれを簡単にチェックすることができます:

enum CONSTEXPR {N = 256};
char s[N];
#ifdef __clang__
        snprintf(s, N, "%s", "clang" __clang_version__);
#else
# ifdef __GNUC__
        snprintf(s, N, "%s %d.%d.%d", "gcc", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
# endif
#endif

次に、sをログに記録するか、TextViewに返します。