web-dev-qa-db-ja.com

Android NDK( `__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_staticstlport_sharedで設定されているように、(APP_STL := stlport_staticApplication.mksystem)から選択できるのは3つだけです。

NDKで利用できる別のライブラリはありますか?

20
Graeme

読んだあと 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
27
Graeme

この問題は、コンパイラオプション-lsupc++を追加することで修正できます。

編集:理由:あなたのコードはC++例外メカニズムを使用しており、コンパイラーは自動的にtry/catch/finalブロック隠しコードを生成し、それがどこかで__cxa_end_cleanupを呼び出します。 lsupc ++は、libsupc ++。aへのリンクを意味します。

この問題を解決する別の方法は、gccに-fno-exceptionsオプションを追加することです。これは、明らかに例外ハンドラメカニズムを無効にすることを意味します。

ところで、他の発生する可能性のあるコンパイルエラーを回避するために、-fno-rttiも追加する必要があります。これは、すべてのAndroidのC++クラスがクラスメモリレイアウトの動的型情報なしでコンパイルされるためです。

つまり、次のオプションの組み合わせのいずれかを使用する必要があります。1。-fno-rtti -fno-exceptions 2. -fno-rtti -lsupc ++

3
osexp2003

ここを見てください: Linux C++:リンカーが奇妙なエラーを出力しています

AndroidのApplication.mkでは、これは次のようになります。

APP_CPPFLAGS := -frtti
3
NuSkooler

私の場合、コンパイラオプションに__cxa_end_cleanupを追加すると、-fexceptionsへの未定義のエラー参照が表示されます。そのオプションを削除すると、未定義のrefはなくなりますが、それは例外ステートメントからコードをクリアする必要があることを意味します。

1
user2054803

私にとっては、-fno-rrtiと-fno-exceptionsを追加してから、両方を処理するコードの「throwchar *」を削除することを意味しました。

0
user3048370