首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android NDK中的链接器错误(未定义对`__cxa_end_cleanup的引用)

Android NDK中的链接器错误(未定义对`__cxa_end_cleanup的引用)
EN

Stack Overflow用户
提问于 2012-02-10 18:45:30
回答 5查看 22.7K关注 0票数 20

在添加了一位同事的一组代码后,我得到了以下输出:

代码语言:javascript
复制
./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_staticstlport_sharedsystem)可以选择,这是由APP_STL := stlport_staticApplication.mk中设置的。

NDK有没有其他可用的库?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-10 19:06:04

在阅读了android-ndk/docs/CPLUSPLUS-SUPPORT.html之后,我发现还有更多的库可以链接到:

代码语言:javascript
复制
             C++       C++   Standard
          Exceptions  RTTI    Library

system        no       no        no
gabi++        no      yes        no
stlport       no      yes       yes
gnustl       yes      yes       yes

这会停止我的链接器错误(并将构建推到一组新的错误上:)

Application.mk

代码语言:javascript
复制
APP_STL := gnustl_static
票数 26
EN

Stack Overflow用户

发布于 2012-02-11 07:38:27

看看这里:Linux C++: Linker is outputting strange errors

在安卓的Application.mk中,这将是:

代码语言:javascript
复制
APP_CPPFLAGS := -frtti
票数 3
EN

Stack Overflow用户

发布于 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++

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9226513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档