【问题标题】:Build issue when using prebuilt libraries with the Android NDK使用带有 Android NDK 的预构建库时的构建问题
【发布时间】:2012-03-15 20:06:32
【问题描述】:

我有一个正在移植的程序,它在创建可执行文件时将多个库链接在一起。我已经使用独立工具链构建了所有这些库,并且使用独立工具链我能够创建一个可在 android 设备上运行的可执行文件。所以,我建立的库似乎是功能性的。现在我正在尝试将这些库与应用程序合并。所以,在我的 android.mk 我有这样的东西:

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 中搞砸了。我将 Eclipse (windows) 与 sequoyah 一起使用。

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    看起来链接器给你一个错误。你应该做的是:

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

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

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

    【讨论】:

    • 我的 Application.mk APP_STL 中有这个 := gnustl_shared 如果我将 -lgnustl_shared 添加到 LOCAL_LDLIBS 它告诉我它没有找到。事实上,如果我查看 libs 目录,gnustl_shared 并没有被复制到那里。这是使用 NDK 7b Windows 安装。关于它为什么不把它拉过来的任何想法? NDK 7 有问题,可能还存在。
    • 如果我手动复制 libgnustl_shared.so,通过将其视为另一个预构建,一切都很好,它解决了我原来的问题,所以我认为你解决了问题。知道为什么添加 APP_STL 设置对我没有这样做。过去的经验告诉我它“应该”有。
    • 我同意你的看法,确实应该有,但我不知道为什么没有。感觉就像 NDK 的一个错误。像这样的奇怪事情让我或多或少地链接到所有图书馆:P
    • 顺便说一句,您不必复制任何库。只需使用 -L. 在 LOCAL_LDLIBS 中提供库的路径
    【解决方案2】:

    我认为这可能与异常支持有关。

    您是否在代码中使用了异常,如果是,您是否使用支持异常的运行时库进行编译? (并在异常情况下编译)?。

    在 ndk 文档中的 CPLUSPLUS-SUPPORT 和 STANDALONE-TOOLCHAIN 文件中有更多相关信息。

    【讨论】:

    • 谢谢,看来这与未链接到 gnustl_shared 有关。查看其他答案和我的更新。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      相关资源
      最近更新 更多