8

Ubuntu10.10でr5bNDKを使用して、Androidプラットフォーム用のC ++コードベース(CMakeを使用)をクロスコンパイルしようとしています。コンパイルフェーズは成功しますが、.soの最終リンクフェーズでは、libsupc ++。aファイル(リンクするように指定)にあるシンボルへの未解決の参照が多数あります。私も-lsupc++を試しましたが違いはありません。

test-gnustl-1 NDKテストアプリをビルドするときに、公式のndk-buildシステムによって生成されるコマンドラインにできるだけ忠実に従うようにしました。

arm-linux-androideabi / lib / libsupc ++。aファイルでarm-linux-androideabi-nmツールを実行すると、エラー出力で参照されている定義済み(T)のシンボルが表示されます。

libsupc ++で定義されているシンボルが見つからない例は、次のとおりです。__gxx_personality_v0

これが私のサンプルリンクラインと結果のエラーのサンプルです。

/home/user/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++ -fPIC -Wall -Wextra -Wno-unused -Wno-multichar -fno-rtti -MMD -MP -MF -ffunction-sections -fexceptions -funwind-tables -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Wa,--noexecstack -DANDROID -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -O0 -DDEBUG -D_DEBUG -g --sysroot=/home/user/android-ndk-r5b/platforms/android-9/arch-arm -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined,-z,noexecstack -L/home/user/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib -L/home/user/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/lib -Wl,-rpath-link=/home/user/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib /home/user/android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/libs/armeabi/libstdc++.a -lc -lsupc++ -shared -o ../../lib/Debug/libFoo.so CMakeFiles/Foo.dir/Foo.c.o CMakeFiles/Foo.dir/Bar.cpp.o CMakeFiles/Foo.dir/Baz.cpp.o

`CMakeFiles/Foo.dir/Foo.cpp.o: In function 'myFunc':
/home/user/myroj/src/native/modules/libFoo/Foo.cpp:292: undefined reference to '__cxa_end_cleanup'
CMakeFiles/Foo.dir/Foo.cpp.o:(.ARM.extab.text.myFunc+0x0): undefined reference to '__gxx_personality_v0'
...
/home/user/android-ndk-r5b/toolchains/android/sources/cxx-stl/gnu-libstdc++/include/bits/vector.tcc:350: undefined reference to '__cxa_begin_catch'
/home/user/android-ndk-r5b/toolchains/android/sources/cxx-stl/gnu-libstdc++/include/bits/vector.tcc:357: undefined reference to '__cxa_rethrow'
/home/user/android-ndk-r5b/toolchains/android/sources/cxx-stl/gnu-libstdc++/include/bits/stl_vector.h:1153: undefined reference to 'std::__throw_length_error(char const*)'
/home/user/android-ndk-r5b/toolchains/android/sources/cxx-stl/gnu-libstdc++/include/bits/stl_tree.h:199: undefined reference to 'std::_Rb_tree_decrement(std::_Rb_tree_node_base*)'
...

単純な.aファイル内の例外とリンクを利用する単純なhello-worldアプリを作成しようとしました。'-lsupc ++'を使用する代わりに、libsupc ++。aライブラリに直接リンクするまで、同じエラーが発生しました。ただし、この同じ手法は、より大きなプロジェクトリンクステップでは機能しませんでした。NDKのドキュメントでは、外部ビルドツールを使用する場合は「-lsupc++」を使用する必要があることも示唆されています。

このリンクの問題を解決する方法についてのアイデアがありません。私は考えられる限り多くの方法でリンクラインを並べ替えようとしました。リンクは一般的に気まぐれなプロセスになる可能性があることを私は知っています。どんな助けでも大歓迎です。

4

1 に答える 1

6

パスに追加し、「/」を「 」句でラップされたすべてのインクルードライブラリに-L/home/user/android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/libs/armeabi"明示的にリンクする必要があることがわかりました。home/user/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/lib/thumb/libsupc++.a--start-group --end-group

うまくいけば、これは他の誰かにも役立つでしょう。

于 2011-06-06T18:22:39.593 に答える