NDKでC++のソースコードをビルドした場合に発生するエラー

4,797 views
Skip to first unread message

waka

unread,
Jan 17, 2012, 9:47:12 PM1/17/12
to 日本Androidの会
こんにちは。wakaと申します。

NDKでC++のソースコードをビルドした場合に発生するエラーについて質問させてください。

[開発環境]
OS : Ubuntu 10.4 (64bit)
NDK : android-ndk-r7

ある複数のC++ソースコードをプロジェクト(Test03jni)直下の jni/ ディレクトリに置き、
ビルドしたところ、以下のようなエラーが出力されました。

twaka@ubuntu:~/eclipse/workspace/Test03jni$ ndk-build
Compile++ thumb : WakaTest <= hogehoge01.cpp
Compile++ thumb : WakaTest <= hogehoge02.cpp
Compile++ thumb : WakaTest <= hogehoge03.cpp
・・・中略・・・
Compile++ thumb : WakaTest <= hogehoge10.cpp
SharedLibrary : libWakaTest.so
./obj/local/armeabi/objs/WakaTest/hogehoge01.o: In function
`CImageClass::Setup(Map*)':
/home/twaka/eclipse/workspace/Test03jni/jni/CImageClass.cpp:73:
undefined reference to `__cxa_end_cleanup'

Webで調べたところ、どうやら __cxa_end_cleanup は libsupc++ に含まれているようなので、
Android.mkに以下のようなリンカに渡すオプションを追加してみたところ
LOCAL_LDLIBS := -lsupc++
「cannot find -lsupc++」と言われてしまいました。

私の環境では libsupc++.a は
./android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi/libsupc+
+.a
にあるので、このパスを環境変数のPATHに追加してみましたが、特に変化はありませんでした。

どなたか、情報をお持ちの方はご教授いただけるとありがたいです。
お手数ですが、よろしくお願いします。


Shin Miyazaki

unread,
Jan 17, 2012, 9:58:21 PM1/17/12
to android-g...@googlegroups.com
$(NDKROOT)/docs/CPLUSPLUS-SUPPORT.html
をご覧ください。

2012年1月18日11:47 waka <tomokazu...@toshiba.co.jp>:


--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


waka

unread,
Jan 18, 2012, 12:05:06 AM1/18/12
to 日本Androidの会
Miyazakiさん

早速のご回答、ありがとうございます!

Application.mkに以下の2行目を追加したところ、
-------------------------------
APP_STL := stlport_shared
STLPORT_FORCE_REBUILD := true <=これを追加
-------------------------------
正常にビルドされたようです。

しかしながら、その後またよく分からないエラーが出てしまいました・・

make: 循環 obj/local/armeabi/libstlport_shared.so <- obj/local/armeabi/
libstlport_shared.so 依存関係が破棄されました.
SharedLibrary : libstlport_shared.so
arm-linux-androideabi-g++: ./obj/local/armeabi/libstlport_shared.so:
No such file or directory
make: *** [obj/local/armeabi/libstlport_shared.so] エラー 1

このプロジェクトの
/obj/local/armeabi/
には確かに libstlport_shared.so というファイルはありません。
あるのは以下の3つの場所なのですが、
./android-ndk-r7/sources/cxx-stl/stlport/libs/x86/libstlport_shared.so
./android-ndk-r7/sources/cxx-stl/stlport/libs/armeabi-v7a/
libstlport_shared.so
./android-ndk-r7/sources/cxx-stl/stlport/libs/armeabi/
libstlport_shared.so
ひょっとしてパスの設定を追加しなければならないのでしょうか?

当方の開発スキルが低くてしょうもない質問をしてしまっているかもしれませんが、
できれば今少しお付き合いください。

どうぞよろしくお願いします。

waka

unread,
Jan 18, 2012, 12:12:19 AM1/18/12
to 日本Androidの会
wakaです。

先ほどのメールに、私が使用している Android.mk を添付しようとして忘れていました。

-----------------------------------------------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := WakaTest

# ソースファイル
LOCAL_SRC_FILES := hogehoge01.cpp hogehoge02.cpp ・・・

# リンカに渡すオプション
LOCAL_LDLIBS := -llog -lstdc++ -lsupc++

# -llog : logcat出力を有効にする (文献1-p39)
# -lstdc++ :
# -lsupc++ :

# C++の例外処理、RTTIを有効にする
LOCAL_CPPFLAGS += -fexceptions
LOCAL_CPPFLAGS += -frtti

include $(BUILD_SHARED_LIBRARY)
-----------------------------------------------------------

よろしくおねがいします。

Shin Miyazaki

unread,
Jan 18, 2012, 1:46:29 AM1/18/12
to android-g...@googlegroups.com
みやざきです

1. stlportはexceptionをサポートしていませんから、必要であればgnustlを使いましょう。
2. stlportを使用する場合でもSTLPORT_FORCE_REBUILDの指定は不要でしょう。
3. libsupc++.aはgnustlの一部ですから、stlportを使用する場合には指定する必要はありません。
 というか、使用ライブラリはndk-buildがよしなにはかってくれるので、LOCAL_LDLIBSには-llogだけあれば十分かと。

waka

unread,
Jan 18, 2012, 3:14:04 AM1/18/12
to 日本Androidの会
みやざきさん

おっしゃる通り、LOCAL_LDLIBS に -lstdc++ や -lsupc++ は不要のようです。
それらを消去して、以下のように設定してビルドすると正常に終了しました。


Application.mk
-------------------------------
APP_STL := stlport_shared
#STLPORT_FORCE_REBUILD := true <=コメントアウト
-------------------------------

Android.mk
-----------------------------------------------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := WakaTest

# ソースファイル
LOCAL_SRC_FILES := hogehoge01.cpp hogehoge02.cpp ・・・

# リンカに渡すオプション
LOCAL_LDLIBS := -llog <= -lstdc++ と -lsupc++ を削除

# C++の例外処理、RTTIを有効にする
#LOCAL_CPPFLAGS += -fexceptions <= コメントアウト
#LOCAL_CPPFLAGS += -frtti <= コメントアウト

include $(BUILD_SHARED_LIBRARY)
-----------------------------------------------------------


余計な設定をしていたのが原因だったようです・・

度々のご教授、ありがとうございました!

Reply all
Reply to author
Forward
0 new messages