LLVM ist der Compiler (Backend). Der verwendete Compiler ist Clang, der sich im Verzeichnis llvm befindet. (LLVM ist der Name der Komponente von Clang, die die eigentliche Codegenerierung durchführt, auch bekannt als Backend.)
Zuvor verwendete das NDK GCC als Compiler. Mit GCC hatte jede Zielarchitektur (arm, aarch64, x86 usw.) eine separate Kopie von GCC, die mit diesem individuell konfigurierten Ziel erstellt wurde. Clang/LLVM hingegen kann auf jede konfigurierte Architektur mit einer einzigen ausführbaren Compilerdatei abzielen. Mit Clang sparen Sie also etwas Speicherplatz und vermeiden, viele separate ausführbare Compilerdateien zu haben. Deshalb gibt es nur eine Kopie des llvm-Verzeichnisbaums.
In NDK r17 stehen Ihnen sowohl GCC- als auch Clang-Compiler zur Verfügung; Clang wird standardmäßig verwendet, aber GCC ist weiterhin für Projekte verfügbar, die noch nicht zur Verwendung von Clang migrieren konnten. In neueren NDK-Versionen wird der alte GCC entfernt.
In den neueren NDK-Versionen werden, selbst wenn GCC entfernt wird, die architekturspezifischen Verzeichnisse wie aarch64-linux-android-4.9
werden immer noch aufbewahrt, da die GNU-Binutils (kleine Tools, die vom Erstellungsprozess verwendet werden) immer noch verwendet werden und diese auch in einer Kopie pro Architektur vorliegen (obwohl sie technisch gesehen möglicherweise über Architekturen hinweg funktionieren).
Und warum Bauen für z.B. arm erwähnt auch x86_64; Wenn Sie Clang oder GCC ausführen, führen Sie eine ausführbare Datei für Ihren Build-Computer aus, auf der x86_64 ausgeführt wird, daher der prebuilt/linux-x86_64
Teil der Pfade.
LLVM ist jetzt ein Umbrela-Projekt und enthält mehrere modulare und wiederverwendbare Compiler- und Toolchain-Technologien. Weitere Einzelheiten finden Sie unter Die LLVM-Compiler-Infrastruktur.
Für Android NDK wurde llvm seit r13b zur Standard-Toolchain und gcc wurde seit r18b entfernt.
Laut Toolchains-Verzeichnis toolchains/llvm/prebuilt/darwin-x86_64
, llvm unterstützt alle ABIs, also x86, x86_64, arm, arm64.
Wahrscheinlich wird es nur eine llvm
geben Verzeichnis unter toolchains
Verzeichnis in zukünftigen NDK-Releases, wenn alle gcc-bezogenen Tools, Header und Bibliotheken vollständig auf llvm portiert sind.
Verweise, die hilfreich sein können:Android-NDK-Pfadvariable für den „strip“-Befehl in der CMake-Build-Toolkette
Aktualisierungen
Ich habe gerade einen kurzen Test mit verschiedenen NDK-Revisionen durchgeführt, um die Konfigurationen für --gcc-toolchain
zu überprüfen und --sysroot
die für die Cross-Kompilierung sind.
Auf 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
Auf 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
Auf 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
Auf 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
Wie oben zu sehen, vor NDK r19b , NDK verwendet den Clang-Compiler, aber den --gcc-toolchain
und --sysroot
sind als die älteren Pfade für Build-Tools, Header und Bibliotheken konfiguriert.
Aber seit NDK r19b , die --gcc-toolchain
und --sysroot
sind als die neuen Toolchains llvm konfiguriert , also toolchains/llvm/prebuilt/darwin-x86_64
, und die Header-Dateien und Bibliotheken der Tools (z. B. ranlib, ar, strip usw.) der "llvm-Version" werden verwendet.
Beachten Sie auch, dass toolchains/llvm/prebuilt/darwin-x86_64
enthält die Unterstützung für alle Android ABIs, also aarch64-linux-android
für arm64-v8a , arm-linux-androideabi
für armeabi-v7a , i686-linux-android
für x86 , x86_64-linux-android
für x86_64 .
Sie können also NDK r19b ausprobieren, wenn Sie nur llvm-Toolchains verwenden möchten.