LLVM è il compilatore (backend). Il compilatore utilizzato è Clang, che risiede nella directory llvm. (LLVM è il nome del componente di Clang che esegue l'effettiva generazione del codice, noto anche come backend.)
In precedenza, l'NDK utilizzava GCC come compilatore. Con GCC, ogni architettura di destinazione (arm, aarch64, x86 ecc.) aveva una copia separata di GCC creata con quella singola destinazione configurata. Clang/LLVM, d'altra parte, può indirizzare qualsiasi architettura configurata con un singolo eseguibile del compilatore. Quindi con Clang risparmierai un po' di spazio su disco, evitando di avere molti eseguibili del compilatore separati. Ecco perché c'è solo una copia dell'albero delle directory llvm.
In NDK r17 sono disponibili sia i compilatori GCC che Clang; Clang è utilizzato per impostazione predefinita, ma GCC è ancora disponibile per i progetti che non sono ancora stati in grado di migrare utilizzando Clang. Nelle versioni più recenti di NDK, il vecchio GCC viene rimosso.
Nelle versioni più recenti di NDK, anche se GCC viene rimosso, le directory specifiche dell'architettura come aarch64-linux-android-4.9
sono ancora conservate, poiché le binutils GNU (strumenti minori utilizzati dal processo di compilazione) sono ancora utilizzate, e anche quelle sono disponibili in una copia per architettura (anche se tecnicamente potrebbero funzionare su più architetture).
E per quanto riguarda il motivo per cui costruire ad es. arm menziona anche x86_64; quando esegui Clang o GCC, esegui un eseguibile per il tuo computer di compilazione che esegue x86_64, da cui il prebuilt/linux-x86_64
parte dei percorsi.
LLVM è ora un progetto ombrello e contiene più compilatori modulari e riutilizzabili e tecnologie di toolchain. Puoi controllare maggiori dettagli su The LLVM Compiler Infrastructure.
Per Android NDK, llvm è diventata la toolchain predefinita da r13b e gcc è stato rimosso da r18b.
Secondo la directory toolchains toolchains/llvm/prebuilt/darwin-x86_64
, llvm supporta tutti gli ABI, ovvero x86, x86_64, arm, arm64.
Probabilmente ci sarà un solo llvm
directory sotto toolchains
directory nelle future versioni di NDK quando tutti gli strumenti, le intestazioni e le librerie relative a gcc saranno completamente portati su llvm.
Riferimenti che possono essere d'aiuto:Variabile di percorso Android NDK per il comando "strip" nella catena di strumenti di compilazione di CMake
Aggiornamenti
Ho appena fatto un rapido test su diverse revisioni NDK per controllare le configurazioni per --gcc-toolchain
e --sysroot
che sono per la compilazione incrociata.
Su 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
Su 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
Su 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
Su 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
Come visto sopra, prima di NDK r19b , NDK utilizza il compilatore clang ma il --gcc-toolchain
e --sysroot
sono configurati come i percorsi precedenti per gli strumenti di compilazione, le intestazioni e le librerie.
Ma, da NDK r19b , il --gcc-toolchain
e --sysroot
sono configurati come le nuove catene di strumenti llvm , ovvero toolchains/llvm/prebuilt/darwin-x86_64
, e verranno utilizzati i file di intestazione e le librerie degli strumenti (ad esempio ranlib, ar, strip, ecc.) della "versione llvm".
Inoltre, tieni presente che toolchains/llvm/prebuilt/darwin-x86_64
contiene il supporto per tutti gli ABI di Android, ovvero aarch64-linux-android
per arm64-v8a , arm-linux-androideabi
per armeabi-v7a , i686-linux-android
per x86 , x86_64-linux-android
per x86_64 .
Quindi, puoi provare NDK r19b se desideri utilizzare esclusivamente le toolchain llvm.