2012-03-15 93 views
1

我有一个程序,我在创建可执行文件时将多个库链接在一起。我已经使用独立工具链构建了所有这些库,并使用了独立工具链,我可以创建一个可在Android设备上运行的可执行文件。所以,看起来我建立的图书馆是功能性的。现在我正试图将这些库合并到一个应用程序中。所以,在我android.mk我有这样的事情:使用Android NDK预构建库时的构建问题

LOCAL_PATH := $(call my-dir) 
ROOT_PATH := $(LOCAL_PATH) 

include $(call all-subdir-makefiles) 
include $(CLEAR_VARS) 

LOCAL_PATH = $(ROOT_PATH) 

LOCAL_MODULE := test-libs 

LOCAL_STATIC_LIBRARIES := staticA 
LOCAL_SHARED_LIBRARIES := sharedA sharedB sharedC sharedD 
LOCAL_SRC_FILES := test-libs.c 

include $(BUILD_SHARED_LIBRARY) 

对于每个库,我有一个Android.mk这样

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := sharedA 

LOCAL_SRC_FILES := sharedA.so 

include $(PREBUILT_SHARED_LIBRARY) 

当我然后建立我的项目(在eclipse ),我得到这个:

C:/ndk/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a(unwind-arm.o): In function `__gnu_unwind_pr_common': 
/cygdrive/c/ndk/android-ndk-r7b/build/core/build-binary.mk:314: recipe for target `obj/local/armeabi/libtest-libs.so' failed 
/tmp/ndk-digit/src/build/../gcc/gcc-4.4.3/libgcc/../gcc/config/arm/unwind-arm.c:1237: undefined reference to `__cxa_call_unexpected' 

有什么想法是什么错了?

此外,静态库和其中一个共享库对任何东西都没有依赖关系,如果我只包含它们都很酷。我的一个共享库只依赖于静态库。如果我只包含这些内容,但是当我包含其他依赖于其他共享库的其他内容时,会发生此问题。

更新1:好吧,它似乎是因为我的Application.mk中的APP_STL设置被忽略。我在Application.mk中的所有内容是: APP_STL:= gnustl_shared 如果我复制libgnustl_shared.so并将它视为另一个预先构建的共享库,则我的问题已消失。任何想法为什么APP_STL不能正常工作。请注意,我可能已经搞砸了。我刚升级到使用7b。使用gnustl_shared与其他应用程序一起工作。回滚到7不能修复它。我想我在Eclipse中搞砸了一些东西。我用sequoyah使用Eclipse(windows)。

回答

1

它看起来像链接器给你一个错误。你应该做的是以下几点:

在你的LOCAL_MODULE:= test-libs下添加一个LOCAL_LDLIBS。在这里,当编译预编译的库时,需要包含所有链接的库。例如:

LOCAL_LDLIBS := -lgnustl_shared -lgcc -llog -landroid -lstdc++ 

基本上你需要确定哪些库包含函数__cxa_call_unexpected。快速谷歌显示它可能在libstdC++中。确保您在创建预编译库时也可以链接该库。

+0

我有这在我的Application.mk APP_STL:= gnustl_shared如果我添加-lgnustl_shared到LOCAL_LDLIBS它告诉我它没有找到。实际上,如果我查看libs目录,那么gnustl_shared不会被复制到那里。这是使用NDK 7b windows安装。任何想法,为什么它不拉扯它? NDK 7中存在问题,可能它仍然存在。 – corbin 2012-03-15 20:53:56

+0

如果我通过手动复制libgnustl_shared.so,将其作为另一个预构建对象来处理,一切都很好,它修复了我的原始问题,所以我认为你已经解决了这个问题。任何想法为什么添加APP_STL设置没有为我做这个。过去的经验告诉我它“应该”具有。 – corbin 2012-03-15 22:15:57

+1

我同意你,它真的应该有,我不知道为什么它不。这感觉就像NDK的一个bug。像这样奇怪的事情让我连接到所有的库或多或少:P – Jake 2012-03-15 23:05:36

1

我在想这可能与异常支持有关。

您是否在代码中使用异常,如果是的话,您是否使用支持异常的运行时库进行编译? (并编译有例外)?.

在ndk文档的CPLUSPLUS-SUPPORT和STANDALONE-TOOLCHAIN文件中有更多内容。

+0

谢谢,看起来它与未链接到gnustl_shared有关。查看其他答案和我的更新。 – corbin 2012-03-15 22:44:19

0

我观察到一个类似的问题,当我的一个只包含C源文件(* .c)的项目引用另一个包含C++文件(* .cpp)的项目时。两个项目的Application.mk文件都有APP_STL:= gnustl_shared。 ndk版本是ndk7e。

解决方案是向仅包含.c文件的项目添加一个空的C++文件(dummy.cpp)。据说ndk明白这个项目应该与gnustl_shared相关联,并且构建成功。