android - 编译时使用 Boost for Android 会抛出错误

标签 android c++ boost android-ndk java-native-interface

这是我在为 Android 使用 Boost 库时遇到的错误。我正在使用 Android NDK r8e 和 boost 1.53 并关注 this tutorial .

/home/tassilo/android-ndks/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lgnustl_static
/home/tassilo/android-ndks/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: jni/boost/lib//libboost_regex-gcc-mt-1_53.a(instances.o): in function boost::object_cache<boost::re_detail::cpp_regex_traits_base<char>, boost::re_detail::cpp_regex_traits_implementation<char> >::do_get(boost::re_detail::cpp_regex_traits_base<char> const&, unsigned int):/home/tassilo/android-ndks/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_list.h:1508: error: undefined reference to 'std::__detail::_List_node_base::_M_transfer(std::__detail::_List_node_base*, std::__detail::_List_node_base*)'
/home/tassilo/android-ndks/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: jni/boost/lib//libboost_regex-gcc-mt-1_53.a(instances.o): in function boost::object_cache<boost::re_detail::cpp_regex_traits_base<char>, boost::re_detail::cpp_regex_traits_implementation<char> >::do_get(boost::re_detail::cpp_regex_traits_base<char> const&, unsigned int):/home/tassilo/android-ndks/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_list.h:1508: error: undefined reference to 'std::__detail::_List_node_base::_M_transfer(std::__detail::_List_node_base*, std::__detail::_List_node_base*)'
/home/tassilo/android-ndks/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: jni/boost/lib//libboost_regex-gcc-mt-1_53.a(instances.o): in function boost::object_cache<boost::re_detail::cpp_regex_traits_base<char>, boost::re_detail::cpp_regex_traits_implementation<char> >::do_get(boost::re_detail::cpp_regex_traits_base<char> const&, unsigned int):/home/tassilo/android-ndks/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_list.h:1516: error: undefined reference to 'std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)'
/home/tassilo/android-ndks/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: jni/boost/lib//libboost_regex-gcc-mt-1_53.a(instances.o): in function boost::object_cache<boost::re_detail::cpp_regex_traits_base<char>, boost::re_detail::cpp_regex_traits_implementation<char> >::do_get(boost::re_detail::cpp_regex_traits_base<char> const&, unsigned int):/home/tassilo/android-ndks/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_list.h:1532: error: undefined reference to 'std::__detail::_List_node_base::_M_unhook()'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi-v7a/libusit.so] Error 1

这是我的 make 文件的样子:

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)

include ./jni/opencv/sdk/native/jni/OpenCV.mk

LOCAL_MODULE           := usit
LOCAL_SRC_FILES        := cr.cpp

LOCAL_CFLAGS += -I$(LOCAL_PATH)/boost/include/boost-1_53
LOCAL_LDLIBS += -L$(LOCAL_PATH)/boost/lib/ -lboost_system-gcc-mt-1_53 -lboost_regex-gcc-mt-1_53 -lboost_filesystem-gcc-mt-1_53 -lboost_date_time-gcc-mt-1_53 \
-L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi \
-lgnustl_static


include $(BUILD_SHARED_LIBRARY)

按照教程中的建议,我指定了 NDK Root 的路径。我正在使用 Ubuntu 12.04 并在 .bashrc 和 .profile 中定义了 NDK_ROOT 变量,如下所示:

export NDK_ROOT=${HOME}/android-ndks/android-ndk-r8e

感谢任何帮助。

编辑:

这是我的Application.mk

APP_PLATFORM          := android-8
APP_ABI               := armeabi-v7a
APP_OPTIM             := debug
NDK_DEBUG             := 1

NDK_TOOLCHAIN_VERSION := 4.6
APP_STL               := gnustl_static
APP_CPPFLAGS          := -fexceptions -frtti

最佳答案

要使用 gnuSTL(静态或共享),您需要参数 APP_STL。通常,我们在 Application.mk 中设置它,但您也可以在命令行中设置它(小心操作,不要混合不同的值)。

我建议安装最新的 NDK,不要使用过时的 4.6 工具链。

Application.mk 示例:

APP_STL := gnustl_static
NDK_TOOLCHAIN_VERSION := 4.8
APP_CPPFLAGS := -std=c++11

关于android - 编译时使用 Boost for Android 会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25844869/

相关文章:

c++ - 使基于选择的循环尽可能响应

C++左移操作

boost - 更改代码以不使用 boost 中的命名空间

c++ - Boost.Lambda 和 Boost.Function 不能很好地与 Boost.Array 配合使用,为什么?

c++ - 设备或资源从头开始和 Alpine 在容器中忙碌,但不在 ubuntu 上

android - 强制 Android 模拟器将更改存储到/system

android - 解析 XML HttpResponse

c++ - 错误 : binding ‘const double’ to reference of type ‘double&’ discards qualifiers

java - 如何以编程方式绘制 ImageButtons 的 5x5 矩阵?

android - 如何在不崩溃的情况下中断 onBackPressed 线程?