Ошибки компоновщика в Android NDK (undefined ссылка на `__cxa_end_cleanup ')
Я получаю этот результат после добавления в набор кода от коллеги:
./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'
Это вызвано тем, что у меня нет доступа к правильному STL.
Насколько мне известно, я могу выбрать только три (stlport_static
, stlport_shared
, system
), заданных APP_STL := stlport_static
в Application.mk
.
Есть ли в NDK другая библиотека?
Ответы
Ответ 1
После прочтения android-ndk/docs/CPLUSPLUS-SUPPORT.html
я обнаружил, что есть еще несколько библиотек, на которые я могу ссылаться:
C++ C++ Standard
Exceptions RTTI Library
system no no no
gabi++ no yes no
stlport no yes yes
gnustl yes yes yes
Это останавливает мои ошибки компоновщика (и толкает сборку на новый набор ошибок:))
Application.mk
APP_STL := gnustl_static
Ответ 2
Посмотрите здесь: Linux С++: компоновщик выводит странные ошибки.
В Android Application.mk это будет:
APP_CPPFLAGS := -frtti
Ответ 3
Вы можете исправить эту проблему, добавив параметр компилятора -lsupc++
.
Отредактировано: Причина: ваш код использует механизм исключения С++, который компилятор автоматически генерирует try/catch/finally, блокирует скрытый код, который в свою очередь вызывает __cxa_end_cleanup где-то. lsupС++ означает ссылку на libsupС++. a
Еще один способ решить эту проблему - добавить параметр -fno-exceptions в gcc, который, очевидно, означает отключить механизм обработчика исключений.
Кстати, вы также должны добавить -fno-rtti, чтобы избежать другой, возможно, возникшей ошибки компиляции, это потому, что
весь класс android С++ скомпилирован без информации динамического типа в макете памяти класса.
Одним словом, вы используете одну из этих опций: 1. -fno-rtti -fno-exceptions 2. -fno-rtti -lsupС++
Ответ 4
В моем случае ошибка undefined, ссылающаяся на __cxa_end_cleanup
появляется, когда я добавляю -fexceptions
к параметрам компилятора. При удалении этой опции undefined ref исчезает, но это означает, что вам нужно очистить свой код от операторов исключений.
Ответ 5
для меня это означало добавление -fno-rrti и -fno-exceptions, а затем избавление от "throw char *" в коде, который позаботился обо всех.