在Linux主机上构建的Android共享库无法与Windows主机上的库构建正确链接

时间:2014-10-13 13:57:31

标签: android c++ android-ndk arm armv7

我正在使用Windows上的Android NDK编译一组几个C ++库来arm-v7a。我在大多数情况下使用ndk-build进行编译。但是,我使用的其中一个库(让它称之为libproblem.so)有一个相当复杂的makefile,所以我使用ajb-tools(https://subversion.assembla.com/svn/ajb-tools/trunk/android/android-cross/android-cross)来调用makefile来构建那个库在 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&)'

当然存在功能。如果我在MinGW的libproblem.so上运行nm,我会看到那里的函数(虽然已经损坏了)。

我目前唯一的想法是使用两个不同的主机操作系统存在问题。因为特别奇怪的是,如果我使用linux作为运行ndk-build的主机操作系统,ndk-build会成功地将libproblem.so与我的其他对象链接起来。 (请记住,Linux和Windows都有相同的NDK版本,NDKr10b,64位主机的32位目标)。

或者我在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

1 个答案:

答案 0 :(得分:0)

如果您可以显示最终链接命令及其生成的完整错误消息,那将非常有用。链接ELF库时,库的顺序很重要,未定义的引用可能来自于此。

使用&#39; ndk-build V = 1&#39;转储构建命令。