Crystax NDK链接器错误

时间:2016-01-14 02:02:47

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

我正在努力工作Crystax NDK example并且出现以下错误(当然我已经弥补了PATH/TO/MY/CRYSTAXNDK/):

$ ndk-build APP_ABI=armeabi-v7a
[armeabi-v7a] Executable     : test-boost
PATH/TO/MY/CRYSTAXNDK/crystax-ndk-10.3.1/sources/boost/1.59.0/include/boost/archive/detail/oserializer.hpp:88: error: undefined reference to 'boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: error: ld returned 1 exit status

实际上,这个例子有点过时了,我已经解决了这个错误:

Android NDK: ERROR:PATH/TO/MY/CRYSTAXNDK/crystax-ndk-10.3.1/sources/boost/1.59.0/Android.mk:boost_atomic_static: LOCAL_SRC_FILES points to a missing file    
Android NDK: Check that PATH/TO/MY/CRYSTAXNDK/crystax-ndk-10.3.1/sources/boost/1.59.0/libs/armeabi-v7a/gnu-/libboost_atomic.a exists  or that its path is correct   

NDK_TOOLCHAIN_VERSION=4.9添加到Android.mk
我还用$(call import-module,boost/1.57.0)替换$(call import-module,boost/1.59.0)来调用Boost库的实际版本
所以,我的Android.mk看起来如下:

# Android.mk
LOCAL_PATH := $(call my-dir)
NDK_TOOLCHAIN_VERSION = 4.9

include $(CLEAR_VARS)
LOCAL_MODULE           := test-boost
LOCAL_SRC_FILES        := test.cpp gps.cpp
LOCAL_STATIC_LIBRARIES := boost_serialization_static
include $(BUILD_EXECUTABLE)

$(call import-module,boost/1.59.0)

我的crystax-ndk目录位于系统路径中。我知道我的问题的原因是NDK链接器无法找到正确的Boost库。但我不知道如何配置它,它将根据目标架构自动选择库。
请帮我弄清楚链接器的配置!
感谢。

2 个答案:

答案 0 :(得分:0)

这是bug。简而言之,libboost_serialization.so是使用GNU libstdc ++ v5构建的,但是当你调用ndk-build时,它会将最终二进制文件与GNU libstdc ++ v4.9链接,这是与GNU libstdc ++ v5(特别是std :: basic_string;如有兴趣,请查看here了解详情。

这由a7c363377修复,并将包含在下一个错误修复版本(10.3.2)中。在此期间,您可以在crystax-ndk-10.3.1文件树上手动应用该补丁来解决问题。

答案 1 :(得分:0)

我在CrytaX博客教程之后遇到了同样的问题。我通过添加以下

来修复它
# Application.mk
APP_ABI := all
NDK_TOOLCHAIN_VERSION := 5
APP_PLATFORM := android-19

第二行修复了ndk-build Boost gcc lib路径错误。第3行在调用可执行文件时修复了“仅位置独立可执行文件”问题。