【问题标题】:How to link multiple static libs in android shared lib如何在android共享库中链接多个静态库
【发布时间】:2014-08-09 15:42:22
【问题描述】:

我使用独立工具链 4.8 为 android 预构建了 boost 库。

我想使用他下面的 boost 库并在 Android.mk 中添加如下

LOCAL_STATIC_LIBRARIES += libboost_atomic \ libboost_date_time \ libboost_exception \ libboost_thread \ libboost_system \ libboost_filesystem

我在 Android.mk 中添加了我自己的静态库 liblocal.a。

我的 android 项目的 JNI 文件夹中有一个 mainactivity.cpp 文件。

我将 header.h 包含在 mainactivity.h 中。 header.h 有使用 boost 库的 classA 的类声明。

在构建 liblocal.a 时,我没有收到任何关于 boost 的链接错误。

在 mainactivity.h 中包含 header.h 时,我收到以下链接错误:

../../../3p/boost/android/include/boost/system/error_code.hpp:222: error: undefined reference to 'boost::system::generic_category()'
../../../3p/boost/android/include/boost/system/error_code.hpp:223: error: undefined reference to 'boost::system::generic_category()'
../../../3p/boost/android/include/boost/system/error_code.hpp:224: error: undefined reference to 'boost::system::system_category()'
../../../3p/boost/android/include/boost/system/error_code.hpp:222: error: undefined reference to 'boost::system::generic_category()'
../../../3p/boost/android/include/boost/system/error_code.hpp:223: error: undefined reference to 'boost::system::generic_category()'
../../../3p/boost/android/include/boost/system/error_code.hpp:224: error: undefined reference to 'boost::system::system_category()'
../../../3p/boost/android/include/boost/system/error_code.hpp:224: error: undefined reference to 'boost::system::system_category()'

谢谢, 比金杜

【问题讨论】:

    标签: android c++ c++11 boost android-ndk


    【解决方案1】:

    如果 liblocal.a 依赖于 libboost_foo.a 中定义的函数,那么它必须出现在静态库列表中之前,即:

    LOCAL_STATIC_LIBRARIES += liblocal.a libboost_foo.a   # GOOD
    

    应该工作,而以下:

    LOCAL_STATIC_LIBRARIES += libboost_foo.a liblocal.a   # BAD
    

    不会,并导致像您描述的那样的链接错误。

    一种解决方法是使用 LOCAL_WHOLE_STATIC_LIBRARIES,它始终强制将列出的静态库中的所有内容包含在结果中(这通常会生成臃肿的二进制文件,但如果您有循环依赖项,则可能是必需的)。

    希望这会有所帮助。

    【讨论】:

    • 这对我没有帮助,我仍然遇到类似的链接错误。
    • 我还有一个疑问。无论我将预构建的静态库(例如:libboost_foo.a)链接到我的 .so 还是只构建我的基本 cpp 源文件,我仍然得到我的 .so 相同大小。在这里,我怀疑我的结果中是否添加了预构建的静态库。所以?
    【解决方案2】:

    已解决:

    我添加了 LOCAL_LDLIBS += -L$(RELATIVE_PATH_TO_LIB) -lmylib -lmylib1,这解决了这个问题。 mylib.a 和 mylib1.a 是我预构建的静态库。

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 2011-01-25
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      相关资源
      最近更新 更多