我正在尝试开始工作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库。但是我不知道如何配置它,它会根据目标体系结构自动选择库。
请帮我弄清楚链接器的配置!
谢谢。

最佳答案

这是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文件树上手动应用该补丁以解决该问题。

关于android - Crystax NDK链接器错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34780495/

10-12 22:27