LLVM es el compilador (backend). El compilador utilizado es Clang, que reside dentro del directorio llvm. (LLVM es el nombre del componente de Clang que genera el código real, también conocido como backend).
Anteriormente, el NDK usaba GCC como compilador. Con GCC, cada arquitectura de destino (arm, aarch64, x86, etc.) tenía una copia separada de GCC creada con ese destino individual configurado. Clang/LLVM, por otro lado, puede apuntar a cualquier arquitectura configurada con un único compilador ejecutable. Entonces, con Clang, ahorrará un poco de espacio en disco, evitando tener muchos ejecutables de compilador separados. Es por eso que solo hay una copia del árbol de directorios llvm.
En NDK r17, tiene compiladores GCC y Clang disponibles; Clang se usa de forma predeterminada, pero GCC todavía está disponible para proyectos que aún no han podido migrar para usar Clang. En las versiones más recientes del NDK, se elimina el antiguo GCC.
En las versiones más recientes del NDK, incluso si se elimina GCC, los directorios específicos de la arquitectura como aarch64-linux-android-4.9
todavía se mantienen, ya que las binutils de GNU (herramientas menores utilizadas por el proceso de compilación) todavía se usan, y también vienen en una copia por arquitectura (aunque técnicamente podrían funcionar en todas las arquitecturas).
Y en cuanto a por qué construir para, p. arm también menciona x86_64; cuando está ejecutando Clang o GCC, está ejecutando un ejecutable para su computadora de compilación que ejecuta x86_64, por lo tanto, prebuilt/linux-x86_64
parte de los caminos.
LLVM es ahora un proyecto paraguas y contiene varias tecnologías de cadenas de herramientas y compiladores modulares y reutilizables. Puede consultar más detalles en La infraestructura del compilador LLVM.
Para Android NDK, llvm se convirtió en la cadena de herramientas predeterminada desde r13b y gcc se eliminó desde r18b.
Según el directorio de cadenas de herramientas toolchains/llvm/prebuilt/darwin-x86_64
, llvm admite todas las ABI, es decir, x86, x86_64, arm, arm64.
Probablemente habrá solo uno llvm
directorio bajo toolchains
directorio en futuras versiones de NDK cuando todas las herramientas, encabezados y librerías relacionados con gcc se transfieran por completo a llvm.
Referencias que pueden ayudar:Variable de ruta del NDK de Android para el comando "strip" en la cadena de herramientas de compilación de CMake
Actualizaciones
Acabo de hacer una prueba rápida en diferentes revisiones de NDK para verificar las configuraciones para --gcc-toolchain
y --sysroot
que son para la compilación cruzada.
En 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
En 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
En 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
En 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
Como se vio arriba, antes de NDK r19b , NDK usa el compilador clang pero el --gcc-toolchain
y --sysroot
se configuran como las rutas más antiguas para las herramientas de compilación, los encabezados y las librerías.
Pero, desde NDK r19b , el --gcc-toolchain
y --sysroot
se configuran como las nuevas cadenas de herramientas llvm , es decir, toolchains/llvm/prebuilt/darwin-x86_64
, y se utilizarán las herramientas (p. ej., ranlib, ar, strip, etc.), los archivos de encabezado y las bibliotecas de la "versión llvm".
Además, tenga en cuenta que toolchains/llvm/prebuilt/darwin-x86_64
contiene el soporte para todas las ABI de Android, es decir, aarch64-linux-android
para arm64-v8a , arm-linux-androideabi
para armabi-v7a , i686-linux-android
para x86 , x86_64-linux-android
para x86_64 .
Por lo tanto, puede probar el NDK r19b si solo desea utilizar cadenas de herramientas llvm.