usar studio para ndk instalar how como 11c android compiler-errors android-ndk linker-errors

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



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.