Android NDK中的链接器错误(未定义对“\ucxa\u end\u cleanup&\x27;”的引用)

Android NDK中的链接器错误(未定义对“\ucxa\u end\u cleanup&\x27;”的引用),android,compiler-errors,android-ndk,linker-errors,Android,Compiler Errors,Android Ndk,Linker Errors,我从一位同事那里添加了一组代码后得到了以下输出: ./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/nat

我从一位同事那里添加了一组代码后得到了以下输出:

./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'
/obj/local/armeabi/objs/jniWrapper/native.o:在函数`\u Vector\u base'中:
D:/opt/android ndk/sources/cxx stl/stlport/stlport/stl/\u vector.h:73:未定义对“cxa\u end\u cleanup”的引用
./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text.\u ZNSt6vectorIhSaIhEEC1ERKS1.[std::vector::vector(std::vector const&)]+0x0):未定义对“个性”的引用
/obj/local/armeabi/objs/jniWrapper/native.o:在函数“std::_node_alloc::deallocate(void*,unsigned int)”中:
D:/opt/android ndk/sources/cxx stl/stlport/stlport/stl/\u alloc.h:161:未定义对“cxa\u end\u cleanup”的引用
./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text.\u ZNSt4priv12\u String\u baseIcSaIcEED2Ev[std::priv::\u String\u base::~\u String\u base()]+0x0):未定义对“\u gxx\u personality\u v0”的引用
./obj/local/armeabi/objs/jniWrapper/native.o:在函数“basic_string”中:
D:/opt/android ndk/sources/cxx stl/stlport/stlport/stl/\u string.c:643:未定义对“cxa\u end\u cleanup”的引用
这是因为我无法访问正确的STL

据我所知,我只能从
APP\u STL:=stlport\u static
Application.mk
中设置的
stlport\u static
stlport\u shared
system
中选择三种


NDK还有其他可用的库吗?

在阅读了
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
这将停止我的链接器错误(并将构建推送到一组新的错误上:)

应用程序.mk

APP_STL := gnustl_static
请看这里:

在Android的Application.mk中,这将是:

APP_CPPFLAGS := -frtti

在我的例子中,当我将
-feexceptions
添加到编译器选项时,会显示对
\ucxa\u end\u cleanup
的错误未定义引用。当删除该选项时,未定义的ref将消失,但这意味着您必须从异常语句中清除代码。

对我来说,这意味着添加-fno rrti和-fno异常,然后在代码中去掉“throw char*”,这两个异常都会得到处理。

您可以通过添加编译器选项
-lsupc++
来解决这个问题

编辑: 原因是:你的代码使用C++异常机制,编译器自动生成TIG/catch(最后)块隐藏代码,这又调用了某处的“X CXAYEnthUn清理”。 lsupc++表示指向libsupc++.a的链接

解决此问题的另一种方法是将-fno异常选项添加到gcc,这显然意味着禁用异常处理程序机制

顺便说一句,您还应该添加-fno-rtti以避免可能遇到的其他编译错误,这是因为 所有Android的C++类都在类内存布局中没有动态类型信息编译。 总之,您应该使用以下选项组合之一: 1. -fno rtti-fno异常
2. -fno rtti-lsupc++

\u cxa***在我看来是特定于GNU的。您确定没有意外地包含非NDK标头(例如来自/usr/include)?a“可能重复的”链接比此问题早10个月。b) 这个问题不是真正的问题,而是关于常见链接/编译问题的教程。C)Link不回答这个问题,因为这个问题是Android NDK问题,而不是一个普通的C++链接问题。@格雷姆:这是什么Android特定的或为什么它是任何相关的规范是如何超过我的联赛。事实上,您缺乏C/C++的基础知识,尤其是链接。这在经典答案中得到了解释。如果你有C++和Android的问题,用不同的问题问他们,在这种情况下,它甚至太宽了。@最后竞赛-我不是一个专家链接它的真实性。但并不是我不懂链接,而是我不知道Android设备上有哪些库。您将知道,使用NDK指定STL与使用命令行编译器不同。您可能还注意到,我的答案中没有任何信息可以在链接的问题中找到。@Graeme:正如我已经写的,您的问题当时太宽泛和/或不清楚。这意味着您仍然需要改进您的问题,使其成为有关堆栈溢出的有效问题。你不能问链接和安卓,谁知道还有什么。它们各自是不同的主题。你需要表达一些最低限度的理解。此外,这不仅是广泛和不清楚的,而且从定义上来说也是离题的:
NDK还有其他可用的库吗?
请参考帮助中心如何提出一个好问题。实际上,这在NDK构建的早期就给我造成了问题。你能给出一些关于此标志如何解决问题的详细信息吗?为什么?把你的答案想象成很多人都会读到的东西,而不是一次性的。你真的不应该提供错误的评论作为答案。你甚至没有解释这个问题。