studio - Errores del vinculador en el NDK de Android(referencia no definida a `__cxa_end_cleanup '')
ndk para android (5)
Estoy obteniendo esta salida después de agregar un conjunto de código de un colega:
./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''
Esto se debe a que no tengo acceso a la STL correcta.
Que yo sepa, solo hay tres que puedo elegir ( stlport_static
, stlport_shared
, system
) según lo establecido por APP_STL := stlport_static
en Application.mk
.
¿Hay otra biblioteca disponible para el NDK?
Después de leer android-ndk/docs/CPLUSPLUS-SUPPORT.html
, encontré que hay un par de bibliotecas más a las que puedo enlazar:
C++ C++ Standard
Exceptions RTTI Library
system no no no
gabi++ no yes no
stlport no yes yes
gnustl yes yes yes
Esto detiene los errores de mi vinculador (y empuja la compilación a un nuevo conjunto de errores :))
Aplicación.mk
APP_STL := gnustl_static
Eche un vistazo aquí: Linux C ++: el enlazador está generando errores extraños .
En Application.mk de Android esto sería:
APP_CPPFLAGS := -frtti
En mi caso, la referencia de error indefinida a __cxa_end_cleanup
aparece cuando agrego -fexceptions
a las opciones del compilador. Al eliminar esa opción, la referencia indefinida desaparece, pero eso significa que debe borrar su código de las declaraciones de excepción.
Puede solucionar este problema agregando la opción del compilador -lsupc++
.
Editado: el motivo: su código está utilizando el mecanismo de excepción de C ++, cuyo compilador genera automáticamente el código oculto de try / catch / finally, que a su vez llama a __cxa_end_cleanup en algún lugar. lsupc ++ significa enlace a libsupc ++. a
Otra forma de resolver este problema es agregar la opción -fno-exceptions a gcc, lo que obviamente significa desactivar el mecanismo del controlador de excepciones.
Por cierto, también debe agregar -fno-rtti para evitar otro error de compilación tal vez encontrado, esto se debe a que toda la clase C ++ de Android se compila sin información de tipo dinámico en el diseño de memoria de clase.
En una palabra, deberías usar una de estas combinaciones de opciones: 1. -fno-rtti -fno-exceptions 2. -fno-rtti -lsupc ++
para mí eso significaba agregar -fno-rrti y -fno-exceptions y luego deshacerse de "throw char *" en el código que se encargó de ambos.