GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wozu dient LLVM in Android NDK Toolchains?

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.


Linux
  1. Was ist die Verwendung des Befehls ‘/usr/bin/[‘ [eckige Klammer] in Linux?

  2. Wie verwendet man inotify richtig?

  3. Was nützt es, das `SIGCHLD`-Signal mit `sigaction(2)` zu ignorieren?

  4. Wozu dient die Option -o im Befehl useradd?

  5. Was ist der Goldlinker?

Was ist die Shell unter Linux?

So verwenden Sie das Linux-Terminal in Android

Was ist die ONLYOFFICE Community-Funktion und warum sollten Sie sie verwenden?

Was ist Termux auf Android?

Welches Zeichen soll verwendet werden, um ein Element an das Ende einer alphabetischen Liste zu stellen?

Was ist das NSFS-Dateisystem?