如何在android共享库中链接多个静态库

时间:2014-08-09 15:42:23

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

我使用独立工具链4.8为Android预构建了升级库。

我想使用他关注boost libs并在Android.mk中添加以下内容

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

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

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

我在mainactivity.h中包含了header.h。 header.h有classA的类声明,它使用boost libs。

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

在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()'

谢谢, Birajendu

2 个答案:

答案 0 :(得分: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,它总是强制列出的静态库中的所有内容都包含在结果中(这通常会生成膨胀的二进制文件,但如果您有循环依赖项,则可能是必需的。)

希望这有帮助。

答案 1 :(得分:0)

解决:

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