我正在尝试开始工作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/