GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuál es el uso de LLVM en las cadenas de herramientas de Android NDK?

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.


Linux
  1. Use la terminal de Linux para ver qué archivos hay en su computadora

  2. Linux vs Unix:¿Cuál es la diferencia?

  3. Qué es y cómo usar la carpeta public_ftp

  4. ¿Cuál es el significado de POSIX?

  5. ¿Cuál es el uso de $# en Bash?

¿Qué es el Shell en Linux?

Cómo usar la terminal de Linux en Android

¿Qué es la función de la comunidad ONLYOFFICE y por qué debería usarla?

¿Qué es Termux en Android?

¿Qué carácter usar para poner un elemento al final de una lista alfabética?

¿Qué es el enlazador de oro?