web-dev-qa-db-fra.com

Erreurs du lieur dans le NDK Android (référence non définie à "__cxa_end_cleanup")

J'obtiens cette sortie après avoir ajouté un ensemble de code à un collègue:

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

Cela est dû au fait que je n'ai pas accès à la STL correcte.

À ma connaissance, il n’ya que trois choix possibles (stlport_static, stlport_shared, system) définis par APP_STL := stlport_static dans Application.mk.

Existe-t-il une autre bibliothèque disponible pour le NDK?

19
Graeme

Après avoir lu Android-ndk/docs/CPLUSPLUS-SUPPORT.html, j’ai trouvé qu’il y avait encore quelques bibliothèques auxquelles je pouvais accéder:

             C++       C++   Standard
          Exceptions  RTTI    Library

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

Cela arrête mes erreurs de l'éditeur de liens (et pousse la construction sur un nouvel ensemble d'erreurs :))

Application.mk

APP_STL := gnustl_static
27
Graeme

Vous pouvez résoudre ce problème en ajoutant l'option du compilateur -lsupc++.

Modifié: La raison: votre code utilise le mécanisme d’exception C++ qui permet au compilateur de générer automatiquement try/catch/finally pour bloquer le code caché qui, à son tour, appelle __cxa_end_cleanup quelque part. Lsupc ++ signifie un lien vers libsupc ++.

Un autre moyen de résoudre ce problème consiste à ajouter l'option -fno-exceptions à gcc, ce qui signifie évidemment désactiver le mécanisme de gestion des exceptions.

Par ailleurs, vous devez également ajouter -fno-rtti pour éviter d’autres erreurs de compilation rencontrées, car Toute la classe C++ d’Android est compilée sans informations de type dynamique dans la structure de la mémoire de classe.

Dans un Word, vous devez utiliser l’une des combinaisons suivantes: 1. -fno-rtti -fno-exceptions 2. -fno-rtti -lsupc ++

3
osexp2003

Jetez un oeil ici: Linux C++: Linker génère des erreurs étranges .

Dans Application.mk d'Android, ce serait:

APP_CPPFLAGS := -frtti
3
NuSkooler

Dans mon cas, l'erreur référence non définie à __cxa_end_cleanup apparaît lorsque j'ajoute -fexceptions aux options du compilateur. Lorsque vous supprimez cette option, la référence non définie disparaît, mais cela signifie que vous devez effacer votre code des instructions d'exception.

1
user2054803

pour moi, cela impliquait d'ajouter -fno-rrti et -fno-exceptions, puis d'éliminer "throw char *" dans le code qui prenait soin des deux.

0
user3048370