Android NDK: как связать несколько сторонних библиотек

Предположим, мы создаем общую библиотеку A, которая должна ссылаться на 2 внешних статических libs B и C. Все, что у вас есть, это libB.a и libC.a, а также их файлы заголовков.

Вот упрощенный Android.mk для libA:

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

AFAIK, способ создания ссылок для общих библиотек:

  1. Захватить все объектные файлы B и C
  2. Вырезать объектные файлы, которые A не ссылается
  3. Разрешить ссылки в B и C

Это дает ошибки ссылок, потому что B и C называют друг друга, в частности, они вызывают функции, которые были удалены на шаге 2, потому что A их не вызывал.

Если мы сами создали статические библиотеки, то это просто вопрос замены LOCAL_STATIC_LIBRARIES на LOCAL_WHOLE_STATIC_LIBRARIES, что предотвращает снятие кода (за счет размера кода). Под капотом он передает -все-архив в компоновщик.

Поскольку мы не строили B и C (и даже не имеем источника для их пересоздания), каковы варианты?

  1. Вручную ссылайтесь на недостающие функции от A, чтобы они не были разделены
  2. Выяснить, как передать – whole-archive в компоновщик для внешних статических библиотек
  3. Используйте PREBUILT_STATIC_LIBRARY (см. Упоминание, но никогда не использовали его, и в соответствии с документами это не звучит применимо в этом случае)
  4. Создайте исполняемый файл вместо общей библиотеки (которая не будет пропускать код одинаково)
  5. Переместить / переименовать внешние библиотеки, чтобы обмануть систему сборки NDK, подумав, что они мои, так что я могу добавить их в LOCAL_WHOLE_STATIC_LIBRARIES.

Я пошел с вариантом 1, потому что это первое, что сработало, но, очевидно, это не здорово. Я спрашиваю, есть ли лучшее решение.

Ответ на этот вопрос ( проблема связывания при создании статических и разделяемых библиотек с Android NDK ) заставила меня задаться вопросом, нужно ли мне переоценивать мою установку сборки (разделяемая библиотека, связанная с внешней статической библиотекой). Я не могу комментировать там, поэтому я задал свой собственный вопрос.

Ответ можно найти в разделе Как справиться с рекурсивными зависимостями между статическими библиотеками, используя компоновщик binutils? ,

 LOCAL_LDLIBS := -L ../external/ -lB -lC -lB 

Я взял образец NDK с двумя библиотеками и сделал минимальные изменения, чтобы продемонстрировать технику:

https://github.com/alexcohn/TwoLibs—circular-dependency/commits/master