Android NDK: cómo vincular varias bibliotecas de terceros

Digamos que estamos construyendo una biblioteca compartida A que necesita enlazar a 2 librerías estáticas externas B y C. Todo lo que tienes es libB.a y libC.a, junto con sus archivos de cabecera.

Aquí está un Android.mk simplificado para libA:

LOCAL_LDLIBS := ../external/libB.a ../external/libC.a include $(BUILD_SHARED_LIBRARY) 

AFAIK, la forma en que se enlazan las obras de las bibliotecas compartidas es:

  1. Agarrar todos los archivos objeto de B y C
  2. Eliminar los archivos objeto que A no hace referencia
  3. Resolver referencias en B y C

Esto da errores de enlace porque B y C se llaman entre sí, específicamente llaman a funciones que han sido eliminadas en el paso 2 porque A no las llamó.

Si construimos las librerías estáticas nosotros mismos, entonces es simplemente una cuestión de reemplazar LOCAL_STATIC_LIBRARIES con LOCAL_WHOLE_STATIC_LIBRARIES, lo que impide la eliminación de código (a expensas del tamaño del código). Bajo el capó, pasa –whole-archive al enlazador.

Como no construimos B y C (y ni siquiera tenemos la fuente para reconstruirlas), ¿cuáles son las opciones?

  1. Hacer referencia manualmente a las funciones que faltan de A, para que no se despojen
  2. Averiguar cómo pasar –whole-archive al enlazador para las bibliotecas externas estáticas
  3. Utilice el PREBUILT_STATIC_LIBRARY (visto lo mencionado, pero nunca lo utilizó, y el de acuerdo con los documentos que no suena aplicable en este caso)
  4. Construya un ejecutable en lugar de una biblioteca compartida (que no quitará el código de la misma manera)
  5. Mover / cambiar el nombre de las librerías externas para engañar al sistema de creación de NDK para que piensen que son mías, para poder agregarlas a LOCAL_WHOLE_STATIC_LIBRARIES.

He ido con la opción 1 porque es la primera cosa que trabajó, pero obviamente no es grande. Estoy preguntando si hay una solución mejor.

La respuesta a esta pregunta ( problema de enlace cuando las bibliotecas estáticas y compartidas preconfiguradas con el NDK de Android ) me hizo preguntarme si necesito reevaluar mi configuración de compilación (biblioteca compartida que enlaza con una biblioteca estática externa). No puedo comentar allí, así que hice mi propia pregunta aquí.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.