【问题标题】:Linker errors in Android NDK (undefined reference to `__cxa_end_cleanup')Android NDK 中的链接器错误(未定义对 `__cxa_end_cleanup' 的引用)
【发布时间】:2012-03-02 20:20:24
【问题描述】:

在添加同事的一组代码后,我得到了这个输出:

./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。

据我所知,我只能从APP_STL := stlport_staticApplication.mk 中设置的三个(stlport_staticstlport_sharedsystem)中进行选择。

NDK 是否有其他库可用?

【问题讨论】:

  • _cxa*** 给我的印象是 GNU 特有的。您确定没有意外包含非 NDK 标头(例如来自 /usr/include)吗?
  • a) “Possible Duplicate of”链接比这个问题早 10 个月。 b)问题不是一个真正的问题,而是一个关于常见链接/编译问题的教程。 c) 链接没有回答这个问题,因为这个问题特别是是一个 Android NDK 问题而不是一般的 C++ 链接问题。
  • @Graeme:这与 Android 有什么关系,或者为什么与规范有多大关系,这超出了我的范围。事实是您缺乏有关 C/C++ 的基础知识,尤其是链接。这确实在规范答案中得到了解释。如果您有 C++ Android 问题,请在单独的问题中提出,在这种情况下,它甚至过于宽泛。
  • @FinalContest - 我不是链接它是真的专家。但并不是我不了解链接,而是我不知道 Android 设备上有哪些库可用。您将知道使用 NDK 指定 STL 与使用命令行编译器不同。您可能还会注意到,我的回答中没有任何信息在链接的问题中可用。
  • @Graeme:正如我已经写过的那样,您的问题当时过于宽泛和/或不清楚。这意味着您仍然需要改进您的问题,使其成为 Stack Overflow 上的有效问题。你不能问关于链接 Android,谁知道还有什么。它们本身就是不同的主题。你需要一些最基本的了解。此外,这不仅宽泛且不明确,而且从定义上来说也是题外话:Is there another library available to the NDK? 请参考帮助中心如何提出一个好问题。

标签: android compiler-errors android-ndk linker-errors


【解决方案1】:

阅读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

【讨论】:

    【解决方案2】:

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

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

    APP_CPPFLAGS := -frtti
    

    【讨论】:

    • 实际上早先在 ndk-build 中为我造成了问题。
    【解决方案3】:

    就我而言,当我将-fexceptions 添加到编译器选项时,会出现对__cxa_end_cleanup 的未定义引用错误。删除该选项时,未定义的 ref 会消失,但这意味着您必须从异常语句中清除代码。

    【讨论】:

      【解决方案4】:

      对我来说,这意味着添加 -fno-rrti 和 -fno-exceptions 然后在处理两者的代码中去掉“throw char*”。

      【讨论】:

        【解决方案5】:

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

        编辑: 原因:您的代码使用 C++ 异常机制,编译器会自动生成 try/catch/finally 块隐藏代码,这些代码又在某处调用 __cxa_end_cleanup。 lsupc++ 表示链接到 libsupc++.a

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

        顺便说一句,您还应该添加 -fno-rtti 以避免其他可能遇到的编译错误,这是因为 所有 android 的 C++ 类都是在类内存布局中没有动态类型信息的情况下编译的。

        总之,您应该使用以下选项组合之一: 1. -fno-rtti -fno-exceptions 2. -fno-rtti -lsupc++

        【讨论】:

        • 您能否详细说明此标志如何解决问题?为什么?将您的答案视为很多人都会阅读的内容,而不仅仅是一次性的。
        • 您真的不应该提供不正确的 cmets 作为答案。你甚至没有解释这个问题。
        猜你喜欢
        • 1970-01-01
        • 2016-11-11
        • 2019-01-16
        • 2013-05-07
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多