Red de conocimiento informático - Material del sitio web - Cómo compilar bibliotecas C++ usando el compilador ndk de Android 1. Descripción general Primero, revisemos las responsabilidades respectivas de Android.mk y Application.mk en el desarrollo de NDK de Android. Android.mk es responsable de configurar lo siguiente: (1) nombre del módulo (LOCAL_MODULE) (2) archivos fuente que se compilarán (LOCAL_SRC_FILES) (3) bibliotecas de terceros (LOCAL_STATIC_LIBRARIES, (4) opciones de compilación/enlace (LOCAL_STATIC_LIBRARIES, LOCAL_SHARED_LIBRARIES ) (5 ) compilador/opciones de enlace (LOCAL_SHARED_LIBRARIES)/opciones de enlace (LOCAL_LDLIBS, LOCAL_CFLAGS) application.mk, responsable de configurar lo siguiente: (1) Tipo ABI de la plataforma de destino (predeterminado: armeabi) (APP_ABI) (2) Cadena de herramientas (Valor predeterminado: GCC 4.8) (3) Tipo de biblioteca estándar C++ (valor predeterminado: sistema) (APP_STL) (4) Modo de lanzamiento/depuración (valor predeterminado: lanzamiento) Se puede ver que las opciones de compilación involucradas en este artículo están en Android.mk y Application .mk, los presentaremos en detalle uno por uno a continuación 2.APP_ABI El nombre completo de ABI es: Interfaz binaria de aplicación, que define un conjunto de reglas que permiten que el código objeto binario compilado se utilice en todos. Programas compatibles con ABI Se ejecutan en el sistema operativo y la plataforma de hardware sin cambios (para definiciones específicas, consulte Baidu o Wikipedia. Se puede juzgar por la definición anterior que ABI define las reglas y la implementación específica se implementa conjuntamente). por el compilador, la CPU y el sistema operativo**** Hecho. Diferentes chips de CPU (como ARM, Intel x86, MIPS) admiten diferentes arquitecturas ABI, los tipos de ABI comunes incluyen: armeabi, armeabi-v7a, x86, x86_64, mips. mips64, arm64-v8a, etc. Es por eso que los programas binarios compilados pueden ejecutarse en Windows pero no en plataformas Mac OS/Linux/Android es porque los chips de CPU y los sistemas operativos son diferentes y admiten diferentes tipos de ABI, por lo que No podemos reconocer los programas binarios de la otra parte. El principio básico de la "compilación cruzada" también está estrechamente relacionado con estos. La compilación cruzada significa usar herramientas de compilación cruzada para compilar en una plataforma y generar un programa ejecutable binario en otra plataforma. ¿Listo? La herramienta de compilación cruzada implementa las reglas ABI definidas por otra plataforma. Usamos la herramienta de compilación cruzada NDK de Android para compilar bibliotecas para la plataforma Android en la plataforma Windows/Linux por el mismo motivo.

Cómo compilar bibliotecas C++ usando el compilador ndk de Android 1. Descripción general Primero, revisemos las responsabilidades respectivas de Android.mk y Application.mk en el desarrollo de NDK de Android. Android.mk es responsable de configurar lo siguiente: (1) nombre del módulo (LOCAL_MODULE) (2) archivos fuente que se compilarán (LOCAL_SRC_FILES) (3) bibliotecas de terceros (LOCAL_STATIC_LIBRARIES, (4) opciones de compilación/enlace (LOCAL_STATIC_LIBRARIES, LOCAL_SHARED_LIBRARIES ) (5 ) compilador/opciones de enlace (LOCAL_SHARED_LIBRARIES)/opciones de enlace (LOCAL_LDLIBS, LOCAL_CFLAGS) application.mk, responsable de configurar lo siguiente: (1) Tipo ABI de la plataforma de destino (predeterminado: armeabi) (APP_ABI) (2) Cadena de herramientas (Valor predeterminado: GCC 4.8) (3) Tipo de biblioteca estándar C++ (valor predeterminado: sistema) (APP_STL) (4) Modo de lanzamiento/depuración (valor predeterminado: lanzamiento) Se puede ver que las opciones de compilación involucradas en este artículo están en Android.mk y Application .mk, los presentaremos en detalle uno por uno a continuación 2.APP_ABI El nombre completo de ABI es: Interfaz binaria de aplicación, que define un conjunto de reglas que permiten que el código objeto binario compilado se utilice en todos. Programas compatibles con ABI Se ejecutan en el sistema operativo y la plataforma de hardware sin cambios (para definiciones específicas, consulte Baidu o Wikipedia. Se puede juzgar por la definición anterior que ABI define las reglas y la implementación específica se implementa conjuntamente). por el compilador, la CPU y el sistema operativo**** Hecho. Diferentes chips de CPU (como ARM, Intel x86, MIPS) admiten diferentes arquitecturas ABI, los tipos de ABI comunes incluyen: armeabi, armeabi-v7a, x86, x86_64, mips. mips64, arm64-v8a, etc. Es por eso que los programas binarios compilados pueden ejecutarse en Windows pero no en plataformas Mac OS/Linux/Android es porque los chips de CPU y los sistemas operativos son diferentes y admiten diferentes tipos de ABI, por lo que No podemos reconocer los programas binarios de la otra parte. El principio básico de la "compilación cruzada" también está estrechamente relacionado con estos. La compilación cruzada significa usar herramientas de compilación cruzada para compilar en una plataforma y generar un programa ejecutable binario en otra plataforma. ¿Listo? La herramienta de compilación cruzada implementa las reglas ABI definidas por otra plataforma. Usamos la herramienta de compilación cruzada NDK de Android para compilar bibliotecas para la plataforma Android en la plataforma Windows/Linux por el mismo motivo.

Estos son los últimos tipos de ABI admitidos por el NDK de Android y sus diferencias: Entonces, ¿cómo se especifica el tipo de ABI? Simplemente agregue una línea al archivo Application.mk: APP_ABI := armeabi-v7a //solo compila la versión armeabi-v7a APP_ABI := armeabi armeabi-v7a //compila armeabi, versión armeabi-v7a APP_ABI := todas //compila todas las versiones 3.LABI: = all //Compilar todas las versiones 3.//Compilar todas las versiones 3.LOCAL_LDLIBS Además de la biblioteca Bionic libc, Android NDK también proporciona muchas otras bibliotecas, puede agregar las siguientes en el archivo Android.mk Dependencias de estas bibliotecas: LOCAL_LDLIBS: = -lfoo Entre ellas, las siguientes bibliotecas están vinculadas de forma predeterminada al compilar el NDK de Android. Las siguientes bibliotecas están vinculadas de forma predeterminada al compilar el NDK de Android y no es necesario agregarlas a LOCAL_LDLIBS: (1) Biblioteca Bionic libc (2) Biblioteca pthread (-lpthread) (3) Matemáticas (-lmath) (4) Biblioteca de soporte C++ (-lstdc++) a continuación, compilé una tabla de bibliotecas que se pueden agregar a LOCAL_LDLIBS. La siguiente tabla muestra las bibliotecas que diferentes versiones de Android NDK pueden agregar a "LOCAL_LDLIBS": Las siguientes son algunas opciones de compilación de CFLAGS comunes que resumí: (1) Opciones de compilación generales: opción de optimización de compilación de O2, generalmente elija O2, teniendo en cuenta el grado de optimización y el tamaño del objetivo. -Wall activa la opción de advertencia en todos los procesos de compilación. -Wall activa la opción de advertencia en todos los procesos de compilación. Todas las advertencias del proceso de compilación -fPIC compila código independiente de la posición, generalmente utilizado para compilar bibliotecas de enlaces dinámicos -shared compila bibliotecas de enlaces dinámicos -fopenmp activa la computación paralela de múltiples núcleos, -Idir configura la ruta de búsqueda del archivo de encabezado, si hay varios -I opciones, la ruta de búsqueda El orden es de izquierda a derecha, es decir, la ruta de enfrente se seleccionará para la búsqueda -nostdinc Esta opción indica una ruta de búsqueda no canónica, y la ruta se seleccionará para la búsqueda -nostdinc Esta opción indica una ruta de búsqueda no canónica. nostdinc Esta opción indica que no se debe buscar el encabezado del archivo en la ruta estándar, sino solo la ruta especificada por la opción -I y la ruta actual. --sysroot=dir Utilice dir como directorio raíz lógico para archivos de encabezado y archivos de biblioteca. Por ejemplo, normalmente si el compilador busca archivos de encabezado en /usr/include y archivos de biblioteca en /usr/lib, utilizará dir /usr. /include y dir/usr/lib reemplazan las rutas correspondientes originales. -llibrary busca una biblioteca llamada biblioteca para vincular -Ldir agrega la ruta de búsqueda para el archivo de biblioteca especificado por la opción -l, es decir, el compilador irá a la ruta del directorio y buscará el archivo de biblioteca especificado por -l. -nostdlib Esta opción le indica al compilador que no use bibliotecas en la ruta estándar al vincular. (2) Opciones de compilación relacionadas con la plataforma ARM -marm -mthumb Elija uno de los dos para especificar si desea compilar el conjunto de instrucciones de pulgar o el conjunto de instrucciones de brazo -march=nombre especifica una arquitectura ARM específica. Las más utilizadas incluyen: -march. =armv6, -march =armv7-a -mfpu=name especifica el tipo de procesador de punto flotante de la plataforma de destino. Los parámetros comunes incluyen -mfpu=neon, -mfpu=vfpv3-d16 -mfloat-abi=name especifica el punto flotante. ABI económico de la plataforma de destino Parámetros admitidos Los parámetros admitidos incluyen: "soft", "softfp" y "hard".