Общая библиотека Android, созданная на хосте Linux, не связана должным образом с библиотекой на хосте Windows

Я собираю набор из нескольких библиотек C ++ для arm-v7a, используя Android NDK в Windows. Я компилирую, используя ndk-build, по большей части. Однако одна из библиотек, которые я использую (назовем это libproblem.so), имеет довольно сложный make-файл, поэтому я использую ajb-tools (https://subversion.assembla.com/svn/ajb-tools/trunk/android/android-cross/android-cross) вызвать make-файл для сборки именно этой библиотеки на Linux. Оба они используют одну и ту же версию NDK.

Я внес несколько изменений в настройки по умолчанию в скрипте android-cross, чтобы соответствовать моему Application.mk, в том числе:

export ANDROID_GCCVER=${ANDROID_GCCVER-4.8}
export ANDROID_PLAT_API_VER=${ANDROID_PLAT_API_VER-10} #not sure what this does...
export ANDROID_PLAT_NDK_VER=${ANDROID_PLAT_NDK_VER-9} #gingerbread
export ANDROID_TUNE=${ANDROID_TUNE-"-mandroid $ANDROID_TUNE_THUMB -mthumb-interwork -Wno-psabi -fpic -funwind-tables -fstack-protector -march=armv7-a -finline-limit=64"}

Это, кажется, работает нормально, и дает мне библиотеку, чей вывод file дает мне это:

../obj/local/armeabi-v7a/libproblem.so: ELF 32-bit LSB shared object, ARM,
version 1 (SYSV), dynamically linked (uses shared libs), not stripped

Затем я связываю его с другими библиотеками, используя следующую информацию в моем файле Makefile.mk.

include $(CLEAR_VARS)
LOCAL_MODULE := problem
LOCAL_SRC_FILES := $(JNI_PATH)/../libs/prebuilt/$(TARGET_ARCH_ABI)/libproblem.so
include $(PREBUILT_SHARED_LIBRARY)

Однако это вызывает ошибку компоновки. Библиотека, которая зависит от libproblem, не может создать общий объект, заявив:

d:/Code/project/jni/SomeCode.cpp:191: error: undefined reference to 'Problem::Client::Client(std::shared_ptr<Problem::Data> const&)'

Функция конечно существует. Если я бегу nm на libproblem.so в MinGW я вижу функцию (хотя и искаженную).

В настоящее время моя единственная мысль заключается в том, что существует проблема с использованием двух разных ОС хоста. Потому что, что особенно странно, это то, что ndk-build успешно связывает libproblem.so с остальными моими объектами, если я использую linux в качестве хоста для запуска ndk-build. (Имейте в виду, что Linux и Windows имеют одинаковую версию NDK, NDKr10b, 32-разрядная цель для 64-разрядного хоста).

Или я что-то пропустил в скрипте android-cross, который создает эту библиотеку способом, несовместимым с моей версией ndk-build?

ОБНОВЛЕНИЕ: команда связывания, которая терпит неудачу, является следующей.

/c/Android/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-
x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libFinal.so -shared
--sysroot=c:/Android/android-ndk-r10b/platforms/android-9/arch-arm d:/Code/project
/obj/local/armeabi-v7a/objs/Final/Final.o d:/Code/project/jni/../libs/prebuilt/
armeabi-v7a/libboost_system.a d:/Code/project/jni/../libs/prebuilt/armeabi-
v7a/libboost_date_time.a d:/Code/project/jni/../libs/prebuilt/armeabi-
v7a/libboost_filesystem.a -lgcc d:/Code/project/obj/local/armeabi-v7a/
lib1noproblem.so d:/Code/project/obj/local/armeabi-v7a/lib2noproblem.so d:/Code/
project/obj/local/armeabi-v7a/libproblem.so d:/Code/project/obj/local/armeabi-
v7a/libgnustl_shared.so -no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8
-Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now  -Lc:/Android/
android-ndk-r10b/platforms/android-9/arch-arm/usr/lib -lm -llog c:/Android/
android-ndk-r10b/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libsupc++.a
-lc -lm -o d:/Code/project/obj/local/armeabi-v7a/libFinal.so

0

Решение

Было бы полезно, если бы вы могли показать команду окончательной ссылки и полное сообщение об ошибке, которое она генерирует. Порядок библиотек важен при связывании библиотек ELF, и из этого может исходить неопределенная ссылка.

используйте ‘ndk-build V = 1’ для вывода команд сборки.

0

Другие решения