Linker errors in Android NDK (undefined reference to `__cxa_end_cleanup')

22,725

Solution 1

After reading android-ndk/docs/CPLUSPLUS-SUPPORT.html I found that there a couple more libraries that I can link to:

             C++       C++   Standard
          Exceptions  RTTI    Library

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

This stops my linker errors (and pushes the build onto a new set of errors :))

Application.mk

APP_STL := gnustl_static

Solution 2

Take a look here: Linux C++: Linker is outputting strange errors.

In Android's Application.mk this would be:

APP_CPPFLAGS := -frtti

Solution 3

You can fix this problem by adding the compiler option -lsupc++.

Edited: The reason: your code is using C++ exception mechanism which compiler automatically generate try/catch/finally block hidden code which in turn call __cxa_end_cleanup somewhere. lsupc++ means link to libsupc++.a

Another way to resolve this problem is add -fno-exceptions option to gcc which obviously means disable exception handler mechanism.

BTW, you should also add -fno-rtti to avoid other maybe-encountered compilation error, this is because all android's C++ class is compiled without dynamic type info in class memory layout.

In a word, you shoud use one of these option combos: 1. -fno-rtti -fno-exceptions 2. -fno-rtti -lsupc++

Solution 4

In my case, the error undefined reference to __cxa_end_cleanup shows up when I add -fexceptions to the compiler options. When removing that option, the undefined ref goes away, but that means you have to clear your code from exception statements.

Share:
22,725
Graeme
Author by

Graeme

Java Enterprise / Android Developer

Updated on July 21, 2020

Comments

  • Graeme
    Graeme almost 4 years

    I'm getting this output after adding in a set of code from a colleague:

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

    This is caused because I don't have access to the correct STL.

    To my knowledge there are only three I can choose from (stlport_static, stlport_shared, system) as set by APP_STL := stlport_static in Application.mk.

    Is there another library available to the NDK?

  • Kevin Parker
    Kevin Parker about 12 years
    Actually caused problems earlier on in ndk-build for me.
  • starmole
    starmole about 10 years
    Could you give some detail on how this flag fixes the problem? And why? Think of your answer as something a lot of people will read, not just a one off.
  • László Papp
    László Papp almost 10 years
    You should really not provide incorrect comments as answers. You do not even explain the issue.