web-dev-qa-db-de.com

Linker Fehler in Android NDK (undefinierter Verweis auf `__cxa_end_cleanup ')

Ich erhalte diese Ausgabe, nachdem ich einen Satz Code von einem Kollegen hinzugefügt habe:

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

Dies liegt daran, dass ich keinen Zugriff auf die richtige AWL habe.

Meines Wissens gibt es nur drei, aus denen ich auswählen kann (stlport_static, stlport_shared, system), wie von APP_STL := stlport_static in Application.mk festgelegt.

Steht dem NDK eine weitere Bibliothek zur Verfügung?

19
Graeme

Nach dem Lesen von Android-ndk/docs/CPLUSPLUS-SUPPORT.html habe ich festgestellt, dass es noch ein paar Bibliotheken gibt, mit denen ich verknüpfen kann:

             C++       C++   Standard
          Exceptions  RTTI    Library

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

Dies stoppt meine Linker-Fehler (und überträgt den Build auf einen neuen Satz von Fehlern :))

Application.mk

APP_STL := gnustl_static
27
Graeme

Sie können dieses Problem beheben, indem Sie die Compileroption -lsupc++ hinzufügen.

Bearbeitet: Der Grund: Ihr Code verwendet einen C++ - Ausnahmemechanismus, der vom Compiler automatisch try/catch/finally-Code generiert, der wiederum irgendwo __cxa_end_cleanup aufruft. lsupc ++ bedeutet Verknüpfung zu libsupc ++

Eine andere Möglichkeit, dieses Problem zu beheben, ist das Hinzufügen der Option -fno-exceptions zu gcc, was offensichtlich bedeutet, den Mechanismus zur Behandlung von Ausnahmen zu deaktivieren.

Übrigens sollten Sie auch -fno-rtti hinzufügen, um andere möglicherweise auftretende Kompilierungsfehler zu vermeiden. Dies liegt daran, dass die gesamte C++ - Klasse von Android ohne dynamische Typinformationen im Klassenspeicherlayout kompiliert wird.

In einem Word sollten Sie eine der folgenden Optionskombinationen verwenden: 1. -fno-rtti -fno-exceptions 2. -fno-rtti -lsupc ++

3
osexp2003

Schauen Sie hier: Linux C++: Linker gibt seltsame Fehler aus .

In der Anwendung von Android.mk wäre dies:

APP_CPPFLAGS := -frtti
3
NuSkooler

In meinem Fall wird der fehlerhafte undefinierte Verweis auf __cxa_end_cleanup angezeigt, wenn ich -fexceptions zu den Compiler-Optionen hinzufüge. Wenn Sie diese Option entfernen, wird der nicht definierte Verweis nicht mehr angezeigt, dies bedeutet jedoch, dass Sie den Code aus den Ausnahmeanweisungen löschen müssen.

1
user2054803

für mich bedeutete das, -fno-rrti und -fno-exceptions hinzuzufügen und dann "throw char *" im Code zu entfernen, der sich um beide kümmerte.

0
user3048370