LLVM est le compilateur (backend). Le compilateur utilisé est Clang, qui réside dans le répertoire llvm. (LLVM est le nom du composant de Clang qui effectue la génération de code proprement dite, c'est-à-dire le backend.)
Auparavant, le NDK utilisait GCC comme compilateur. Avec GCC, chaque architecture cible (arm, aarch64, x86, etc.) avait une copie distincte de GCC construite avec cette cible individuelle configurée. Clang/LLVM, d'autre part, peut cibler n'importe quelle architecture configurée avec un seul exécutable de compilateur. Ainsi, avec Clang, vous économiserez un peu d'espace disque, évitant d'avoir de nombreux exécutables de compilateur séparés. C'est pourquoi il n'y a qu'une seule copie de l'arborescence de répertoires llvm.
Dans NDK r17, vous disposez à la fois des compilateurs GCC et Clang ; Clang est utilisé par défaut mais GCC est toujours disponible pour les projets qui n'ont pas encore pu migrer vers l'utilisation de Clang. Dans les nouvelles versions de NDK, l'ancien GCC est supprimé.
Dans les nouvelles versions de NDK, même si GCC est supprimé, les répertoires spécifiques à l'architecture comme aarch64-linux-android-4.9
sont toujours conservés, car les binutils GNU (outils mineurs utilisés par le processus de construction) sont toujours utilisés, et ceux-ci sont également fournis en une copie par architecture (même s'ils peuvent techniquement fonctionner sur plusieurs architectures).
Et quant à savoir pourquoi construire pour par exemple. arm mentionne également x86_64 ; lorsque vous exécutez Clang ou GCC, vous exécutez un exécutable pour votre ordinateur de construction qui exécute x86_64, d'où le prebuilt/linux-x86_64
une partie des chemins.
LLVM est maintenant un projet parapluie, et il contient plusieurs technologies de compilateur et de chaîne d'outils modulaires et réutilisables. Vous pouvez vérifier plus de détails sur l'infrastructure du compilateur LLVM.
Pour Android NDK, llvm est devenu la chaîne d'outils par défaut depuis r13b et gcc a été supprimé depuis r18b.
Selon le répertoire des chaînes d'outils toolchains/llvm/prebuilt/darwin-x86_64
, llvm prend en charge tous les ABI, c'est-à-dire x86, x86_64, arm, arm64.
Il n'y aura probablement qu'un seul llvm
répertoire sous toolchains
répertoire dans les futures versions de NDK lorsque tous les outils, en-têtes et bibliothèques liés à gcc seront complètement portés sur llvm.
Références pouvant aider :variable de chemin Android NDK pour la commande "strip" dans la chaîne d'outils de génération CMake
Mises à jour
Je viens de faire un test rapide sur différentes révisions NDK pour vérifier les configurations pour --gcc-toolchain
et --sysroot
qui sont pour la compilation croisée.
Sur 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
Sur 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
Sur 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
Sur 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
Comme vu ci-dessus, avant NDK r19b , NDK utilise le compilateur clang mais le --gcc-toolchain
et --sysroot
sont configurés comme les anciens chemins pour les outils de construction, les en-têtes et les bibliothèques.
Mais, depuis NDK r19b , le --gcc-toolchain
et --sysroot
sont configurés comme les nouvelles chaînes d'outils llvm , soit toolchains/llvm/prebuilt/darwin-x86_64
, et les outils (par exemple ranlib, ar, strip, etc.) les fichiers d'en-tête et les bibliothèques de "version llvm" seront utilisés.
Notez également que toolchains/llvm/prebuilt/darwin-x86_64
contient le support de tous les ABI Android, c'est-à-dire aarch64-linux-android
pour arm64-v8a , arm-linux-androideabi
pour armeabi-v7a , i686-linux-android
pour x86 , x86_64-linux-android
pour x86_64 .
Ainsi, vous pouvez essayer le NDK r19b si vous souhaitez utiliser uniquement les chaînes d'outils llvm.