在添加了一位同事的一组代码后,我得到了以下输出:
./obj/local/armeabi/objs/jniWrapper/native.o: In function `_Vector_base':
D:/opt/android-ndk/sources/cxx-stl/stlport/stlport/stl/_vector.h:73: undefined reference to `__cxa_end_cleanup'
./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text._ZNSt6vectorIhSaIhEEC1ERKS1_[std::vector<unsigned char, std::allocator<unsigned char> >::vector(std::vector<unsigned char, std::allocator<unsigned char> > const&)]+0x0): undefined reference to `__gxx_personality_v0'
./obj/local/armeabi/objs/jniWrapper/native.o: In function `std::__node_alloc::deallocate(void*, unsigned int)':
D:/opt/android-ndk/sources/cxx-stl/stlport/stlport/stl/_alloc.h:161: undefined reference to `__cxa_end_cleanup'
./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text._ZNSt4priv12_String_baseIcSaIcEED2Ev[std::priv::_String_base<char, std::allocator<char> >::~_String_base()]+0x0): undefined reference to `__gxx_personality_v0'
./obj/local/armeabi/objs/jniWrapper/native.o: In function `basic_string':
D:/opt/android-ndk/sources/cxx-stl/stlport/stlport/stl/_string.c:643: undefined reference to `__cxa_end_cleanup'这是因为我无法访问正确的STL。
据我所知,我只有三个(stlport_static,stlport_shared,system)可以选择,这是由APP_STL := stlport_static在Application.mk中设置的。
NDK有没有其他可用的库?
发布于 2012-02-10 19:06:04
在阅读了android-ndk/docs/CPLUSPLUS-SUPPORT.html之后,我发现还有更多的库可以链接到:
C++ C++ Standard
Exceptions RTTI Library
system no no no
gabi++ no yes no
stlport no yes yes
gnustl yes yes yes这会停止我的链接器错误(并将构建推到一组新的错误上:)
Application.mk
APP_STL := gnustl_static发布于 2012-02-11 07:38:27
发布于 2014-06-24 10:29:51
您可以通过添加编译器选项-lsupc++来解决此问题。
编辑:原因:您的代码使用了C++异常机制,编译器会自动生成try/catch/finally块隐藏代码,然后在某个地方调用__cxa_end_cleanup。lsupc++表示链接到libsupc++.a
解决这个问题的另一种方法是向gcc添加-fno-exceptions选项,这显然意味着禁用异常处理机制。
顺便说一句,你也应该添加-fno-rtti以避免其他可能遇到的编译错误,这是因为所有安卓的C++类都是在类内存布局中没有动态类型信息的情况下编译的。
总之,您应该使用以下选项组合之一: 1. -fno-rtti fno-exceptions 2. -fno-rtti -lsupc++
https://stackoverflow.com/questions/9226513
复制相似问题