GNU/Linux >> Linux の 問題 >  >> Linux

Android NDK ツールチェーンでの LLVM の使用は何ですか?

LLVM はコンパイラ (バックエンド) です。使用されるコンパイラは、llvm ディレクトリ内にある Clang です。 (LLVM は、実際のコード生成、別名バックエンドを行う Clang のコンポーネントの名前です。)

以前は、NDK は GCC をコンパイラとして使用していました。 GCC では、各ターゲット アーキテクチャ (arm、aarch64、x86 など) には、その個々のターゲットが構成された GCC の個別のコピーが構築されていました。一方、Clang/LLVM は、単一のコンパイラ実行可能ファイルを使用して、構成された任意のアーキテクチャをターゲットにすることができます。そのため、Clang を使用すると、個別のコンパイラ実行可能ファイルを多数用意する必要がなくなり、ディスク容量を少し節約できます。そのため、llvm ディレクトリ ツリーのコピーは 1 つだけです。

NDK r17 では、GCC コンパイラと Clang コンパイラの両方を利用できます。デフォルトでは Clang が使用されますが、まだ Clang を使用するように移行できていないプロジェクトでは、GCC を引き続き使用できます。新しい NDK バージョンでは、古い GCC は削除されています。

新しい NDK バージョンでは、GCC が削除されても、aarch64-linux-android-4.9 のようなアーキテクチャ固有のディレクトリ GNU binutils (ビルド プロセスで使用されるマイナー ツール) がまだ使用されているため、それらはまだ保持されており、それらもアーキテクチャごとに 1 つのコピーで提供されます (技術的にはアーキテクチャ間で動作する可能性がありますが)。

そして、例えばのために構築する理由については。 arm は x86_64 についても言及しています。 Clang または GCC を実行しているときは、x86_64 を実行するビルド コンピューターの実行可能ファイルを実行しているため、prebuilt/linux-x86_64


LLVM は現在包括的なプロジェクトであり、複数のモジュール式で再利用可能なコンパイラとツールチェーン テクノロジが含まれています。詳細については、LLVM コンパイラ インフラストラクチャで確認できます。

Android NDK では、r13b から llvm がデフォルトのツールチェーンになり、r18b から gcc が削除されました。

ツールチェーン ディレクトリ toolchains/llvm/prebuilt/darwin-x86_64 によると 、llvm はすべての ABI、つまり x86、x86_64、arm、arm64 をサポートします。

おそらく llvm は 1 つだけです。 toolchains の下のディレクトリ 今後の NDK リリースでは、gcc 関連のすべてのツール、ヘッダー、およびライブラリが完全に llvm に移植されます。

役立つ参考文献:CMake ビルド ツール チェーンの「strip」コマンドの Android NDK パス変数

アップデート

--gcc-toolchain の構成を確認するために、さまざまな NDK リビジョンで簡単なテストを行いました と --sysroot これはクロスコンパイル用です。

r16b で

--target=armv7-none-linux-androideabi 
--gcc-toolchain=~/ndks/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r16b/sysroot 

r17c の場合

--target=armv7-none-linux-androideabi
--gcc-toolchain=~/ndks/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r17c/sysroot

r18b で

--target=armv7-none-linux-androideabi19
--gcc-toolchain=~/ndks/android-ndk-r18b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r18b/sysroot

r19b

--target=armv7-none-linux-androideabi19 
--gcc-toolchain=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64 
--sysroot=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64/sysroot 

上記のように、NDK r19b より前 、NDK は clang コンパイラを使用しますが、--gcc-toolchain および --sysroot ビルド ツール、ヘッダー、およびライブラリの古いパスとして構成されます。

ただし、NDK r19b 以降--gcc-toolchain--sysroot 新しいツール チェーン llvm として構成されます 、つまり toolchains/llvm/prebuilt/darwin-x86_64 、およびツール (たとえば、ranlib、ar、strip など) のヘッダー ファイルと "llvm バージョン" のライブラリが使用されます。

また、toolchains/llvm/prebuilt/darwin-x86_64 にも注意してください。 すべての Android ABI、つまり aarch64-linux-android のサポートが含まれています arm64-v8a 用 、 arm-linux-androideabi armeabi-v7a 用 、 i686-linux-android x86 用 、 x86_64-linux-android x86_64 用 .

そのため、純粋に llvm ツールチェーンを使用したい場合は、NDK r19b を試すことができます。


Linux
  1. Linuxでの‘/ usr / bin / [‘[角かっこ]コマンドの使用法は何ですか?

  2. basenameコマンドの使用方法は?

  3. public_ftpフォルダーとは何ですか。

  1. POSIX とはどういう意味ですか?

  2. `sigaction(2)` で `SIGCHLD` シグナルを無視することの使用は何ですか?

  3. useradd コマンドでオプション -o を使用するとは何ですか?

  1. Linuxターミナルを使用して、コンピューターにあるファイルを確認します

  2. LinuxとUnix:違いは何ですか?

  3. ゴールドリンカーとは何ですか?