Компиляция библиотеки C для Android, но символы не найдены
Я пытаюсь скомпилировать простую библиотеку C для Android, но в результате библиотека не содержит никаких символов / объектов! Я проверяю библиотеку, используя nm
команда.
Это Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_lib_static
LOCAL_MODULE_FILENAME := libmylib
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := File1.c File2.c
include $(BUILD_SHARED_LIBRARY)
# or include $(BUILD_STATIC_LIBRARY)
РЕДАКТИРОВАТЬ:
Создается подпапка "objs", в которой есть все символы.
РЕДАКТИРОВАТЬ:
Это вывод gobjdump
:
MyLibBot.o: file format elf32-littlemips
gobjdump: MyLibBot.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols
MyLibCommon.o: file format elf32-littlemips
gobjdump: MyLibCommon.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols
MyLibGameLogic.o: file format elf32-littlemips
gobjdump: MyLibGameLogic.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols
MyLibUndoStack.o: file format elf32-littlemips
gobjdump: MyLibUndoStack.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols
2 ответа
Вы должны указать флаг -D для nm, если хотите, чтобы он отображал динамические символы.
Вы также можете использовать флаг -T для objdump
Вам следует использовать версии nm или objdump, представленные в ndk, а не версии, которые можно найти для управления библиотеками хоста разработки. Они будут найдены в папке toolchains/ ndk и будут иметь префиксные имена, например arm-linux-androideabi-nm
Например, (в системе, которую я некоторое время не использовал для работы с Android, поэтому в ней содержится устаревшая версия - вам придется проявить изобретательность, чтобы найти то, что применимо к вашей системе):
$NDK/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-nm -D mylibrary.so
У меня похожая проблема. Вы можете обойти эту нестандартную сборку так, чтобы -lotherlib передавался как последний аргумент. Например:
$ /path/to/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \
--sysroot=/path/to/platforms/android-19/arch-arm \
-L/usr/local/src/lua-5.1.5/src -shared -lm -o mylibrary.so milibrary.o \
-lotherlib
Я не эксперт по Си, поэтому мне потребовались дни, чтобы понять:P, не уверен, почему -l должен идти в самом конце...