#android #makefile #multiple-makefiles
#Android #makefile #несколько-makefiles
Вопрос:
Мне нужна небольшая помощь с make-файлами Android.
Для 2 моих приложений есть один общий модуль. Я планировал создать makefile для общего модуля common.mk
и включить его в оба моих приложения.
Вот так:
app1:
=====
main.c
Android.mk
...
...
include ../common/common.mk
LOCAL_MODULE := app1
...
...
app2:
=====
main.c
Android.mk
...
...
include ../common/common.mk
LOCAL_MODULE := app2
...
...
common:
=======
common.mk
common.c
когда я создаю из корневого каталога с помощью make app2
, я получаю множественные ошибки определения для всех функций, которые не входят в общий модуль.
Я пришел к выводу, что common.mk включается дважды, пока система сборки Android ищет правильную цель (app2 в моем случае). Именно поэтому возникает проблема.
Теперь, как мне это контролировать? Каков стандартный способ в Android?
Ответ №1:
Правильным способом должно быть создание общей библиотеки (общей или статической) с использованием целей BUILD_SHARED_LIBRARY
или BUILD_STATIC_LIBRARY
.
А затем добавить их в app1
и app2
просто использовать LOCAL_STATIC_LIBRARIES
или LOCAL_SHARED_LIBRARIES
для создания зависимости между app1
, app2
и common
.
Проверьте Android.mk спецификация синтаксиса файла для получения дополнительной информации:
BUILD_SHARED_LIBRARY
Указывает на сценарий сборки, который собирает всю информацию о модуле, предоставленную вами в переменных LOCAL_XXX, и определяет, как создать целевую общую библиотеку из перечисленных вами источников. Обратите внимание, что у вас должны быть определены LOCAL_MODULE и LOCAL_SRC_FILES, как минимум, перед включением этого файла.
Пример использования:
include $(BUILD_SHARED_LIBRARY)
Обратите внимание, что при этом будет сгенерирован файл с именем lib$(LOCAL_MODULE).so
BUILD_STATIC_LIBRARY
Вариант BUILD_SHARED_LIBRARY, который используется для создания целевой статической библиотеки вместо этого. Статические библиотеки не копируются в ваш проект / пакеты, но могут использоваться для создания общих библиотек (см. LOCAL_STATIC_LIBRARIES и LOCAL_WHOLE_STATIC_LIBRARIES, описанные ниже).
Пример использования:
include $(BUILD_STATIC_LIBRARY)
Обратите внимание, что при этом будет сгенерирован файл с именем lib$(LOCAL_MODULE).a
LOCAL_STATIC_LIBRARIES ЛОКАЛЬНЫЕ_СТАТИЧЕСКИЕ БИБЛИОТЕКИ
Список модулей статических библиотек (созданных с помощью BUILD_STATIC_LIBRARY), которые должны быть связаны с этим модулем. Это имеет смысл только в модулях общей библиотеки.
LOCAL_SHARED_LIBRARIES
Список модулей разделяемых библиотек, от которых зависит этот модуль, зависит во время выполнения. Это необходимо во время соединения и для встраивания соответствующей информации в сгенерированный файл.
Комментарии:
1. Спасибо за ответ. Это, конечно, процедура, но я не хочу встраивать модуль в библиотеку. Внутри есть другие переменные common.mk который будут использовать мои приложения. Так что библиотеки было бы недостаточно для моей потребности.
2. @Manty Вместо создания библиотеки вы можете просто включить
common.c
файл, выполнивLOCAL_SRC_FILES = ../common/common.c
в обоихAndroid.mk
.3. Моя система немного сложна. Я не могу этого сделать. Мне нужно найти способ.
4. @Manty Итак, попробуйте обернуть функции, определенные в,
common.mk
некоторымиifndef
, чтобы не переопределять их.5. Могу ли я использовать ifndef в файлах mk? Извините, я не в курсе.
Ответ №2:
В common.mk переменная, которую вы используете для назначения файлов C, использует:= вместо =.
Всякий раз, когда common.mk вызывается, он присваивает независимое значение каждому модулю