我正在努力工作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库。但我不知道如何配置它,它将根据目标架构自动选择库。
请帮我弄清楚链接器的配置!
感谢。
答案 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行在调用可执行文件时修复了“仅位置独立可执行文件”问题。