Android NDK: связывание статической библиотеки с общей библиотекой

Я пытаюсь скомпилировать свой родной код. Вот мой файл android.mk

//part1-static lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := irrlicht
IRRLICHT_LIB_NAME := lib$(LOCAL_MODULE).a

LOCAL_C_INCLUDES := include

LOCAL_SRC_FILES := \    
CColorConverter.cpp \
CCSMLoader.cpp \
CCubeSceneNode.cpp \
CD3D8Driver.cpp \
include $(BUILD_STATIC_LIBRARY)

//part-2 shared lib
include $(CLEAR_VARS)
LOCAL_MODULE := irrlichttest
LOCAL_SRC_FILES := test-app.cpp test.cpp android-receiver.cpp
LOCAL_C_INCLUDES := include
LOCAL_CFLAGS := -O3 -DANDROID_NDK -DDISABLE_IMPORTGL -I$(LOCAL_PATH)/../include/ -  I./include/
LOCAL_CPPFLAGS := -Wno-error=format-security
LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lGLESv2
LOCAL_STATIC_LIBRARIES := irrlicht
include $(BUILD_SHARED_LIBRARY)

и вот мое приложение.

APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-10
APP_MODULE := irrlicht irrlichttest

я хочу сначала скомпилировать модуль "irrlicht", а затем модуль "irrlichttest". Проблема, с которой я столкнулся, заключается в том, что мой модуль irrlichttest сначала компилируется, и он начинает искать ссылку и дает мне неопределенную ошибку ссылки. Прямо сейчас, если я компилирую только part1(статическая библиотека) он успешно генерирует libirrlicht.a, но с part2 он начинает давать мне ошибку. Что я делаю не так?

2 ответа

Решение

У вас есть один дополнительный \ в конце вашего первого определения LOCAL_SRC_FILES, это заставляет часть 'include $(BUILD_STATIC_LIBRARY)' перейти в LOCAL_SRC_FILES, и строка никогда не анализируется / не выполняется. Другими словами, благодаря этому определение вашего модуля для модуля 'iirlicht' полностью игнорируется ndk-build, поэтому проблема, с которой вы сталкиваетесь.

Удалите \ after CD3D8Driver.cpp, и это должно исправить это.

NDK скомпилирует источники irrlichttest, затем источники irrlich, затем создаст libirrlich.a и только после этого будет связывать libirrlichttest.so. Это очень проницательно, чтобы бежать

ndk-build clean all V=1

и посмотрите в журнале сборки, какие команды фактически выполняются для сборки проекта.

Другие вопросы по тегам