GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è l'uso di LLVM nelle toolchain Android NDK?

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.


Linux
  1. Qual è l'uso del comando '/usr/bin/[' [parentesi quadra] in Linux?

  2. Come utilizzare il comando basename?

  3. Cosa è successo allo spazio libero?

  4. Qual è il significato di POSIX?

  5. Quale comando devo usare per vedere qual è l'impronta digitale della chiave ECDSA del mio server?

Che cos'è la shell in Linux?

Come utilizzare il terminale Linux in Android

Cos'è la funzionalità della community di ONLYOFFICE e perché dovresti usarla?

Cos'è Termux su Android?

Quale carattere usare per mettere un elemento alla fine di un elenco alfabetico?

Cos'è il linker d'oro?