Ошибки компоновщика в Android NDK (неопределенная ссылка на `__cxa_end_cleanup ') - PullRequest
19 голосов
/ 10 февраля 2012

Я получаю этот вывод после добавления кода коллеги:

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

Ответы [ 5 ]

27 голосов
/ 10 февраля 2012

После прочтения 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 голосов
/ 24 июня 2014

Вы можете решить эту проблему, добавив параметр компилятора -lsupc++.

Отредактировано: Причина: ваш код использует механизм исключений C ++, который компилятор автоматически генерирует try / catch / finally, чтобы блокировать скрытый код, который, в свою очередь,вызовите где-нибудь __cxa_end_cleanup.lsupc ++ означает ссылку на libsupc ++. a

Другим способом решения этой проблемы является добавление опции -fno-exceptions в gcc, что, очевидно, означает отключение механизма обработчика исключений.

Кстати, вы также должны добавить -fno-rtti, чтобы избежать других возможных ошибок компиляции, это потому, что весь класс C ++ android компилируется без динамической информации о типе в макете памяти классов.

Одним словом, вы должны использовать одну из следующих комбинаций параметров: 1.-fno-rtti -fno-exceptions 2. -fno-rtti -lsupc ++

3 голосов
/ 11 февраля 2012

Посмотрите здесь: Linux C ++: компоновщик выводит странные ошибки .

В Android's Application.mk это будет:

APP_CPPFLAGS := -frtti
1 голос
/ 08 февраля 2013

В моем случае, неопределенная ссылка на __cxa_end_cleanup появляется, когда я добавляю -fexceptions к параметрам компилятора.При удалении этой опции неопределенная ссылка пропадает, но это означает, что вы должны очистить свой код от операторов исключений.

0 голосов
/ 19 декабря 2013

для меня это означало добавление -fno-rrti и -fno-exception, а затем избавление от «throw char *» в коде, который позаботился об обоих.

...