Подтвердить что ты не робот

Ошибки компоновщика в 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 другая библиотека?

4b9b3361

Ответ 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

Ответ 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 *" в коде, который позаботился обо всех.