2012-03-15 8 views
1

私は実行可能ファイルを作成する際に複数のライブラリをリンクするプログラムを持っています。スタンドアローンのツールチェーンを使用してこれらのライブラリをすべてビルドし、スタンドアロンのツールチェーンを使用して、アンドロイドデバイスで動作する実行可能ファイルを作成できます。ですから、私が構築したライブラリは機能的なようです。今、私はそれらのライブラリをアプリに組み込もうとしています。だから、私のandroid.mkに、私はこのようなものがあります:Android NDKで事前ビルドされたライブラリを使用する際に問題を構築します

LOCAL_PATH := $(call my-dir) 
ROOT_PATH := $(LOCAL_PATH) 

include $(call all-subdir-makefiles) 
include $(CLEAR_VARS) 

LOCAL_PATH = $(ROOT_PATH) 

LOCAL_MODULE := test-libs 

LOCAL_STATIC_LIBRARIES := staticA 
LOCAL_SHARED_LIBRARIES := sharedA sharedB sharedC sharedD 
LOCAL_SRC_FILES := test-libs.c 

include $(BUILD_SHARED_LIBRARY) 

ライブラリのそれぞれについての、私はそれから日食に(私のプロジェクトをビルドすると、この

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := sharedA 

LOCAL_SRC_FILES := sharedA.so 

include $(PREBUILT_SHARED_LIBRARY) 

ようAndroid.mkを持っています)、私はこれを取得:間違って何が起こっているかの

C:/ndk/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a(unwind-arm.o): In function `__gnu_unwind_pr_common': 
/cygdrive/c/ndk/android-ndk-r7b/build/core/build-binary.mk:314: recipe for target `obj/local/armeabi/libtest-libs.so' failed 
/tmp/ndk-digit/src/build/../gcc/gcc-4.4.3/libgcc/../gcc/config/arm/unwind-arm.c:1237: undefined reference to `__cxa_call_unexpected' 

任意の考え?

また、静的ライブラリと共有ライブラリのいずれかには何の依存関係もなく、それらのみを含めるとすべてがクールです。私の共有ライブラリの1つは静的ライブラリに依存していました。それらを含めるだけで他の共有ライブラリに依存する他のものを含めると、この問題が発生します。

更新1:これは、私のApplication.mkのAPP_STL設定が無視されているためです。私がApplication.mkに持っているものは次のとおりです: APP_STL:= gnustl_shared libgnustl_shared.soをコピーして別のビルド済み共有ライブラリのように扱うと、私の問題は解消されました。 APP_STLが正しく動作しない理由注:私は何かをねじっている可能性があります。私は7bを使用するようにアップグレードしました。 gnustl_sharedを使って私のために他のアプリと一緒に働いていました。 7にロールバックしても問題は解決しません。私はEclipseで何かを混乱させたと思う。私は、SequoyahでEclipse(ウィンドウズ)を使用しています。

答えて

1

リンカがエラーを表示しているようです。あなたがするべきことは次のとおりです:

あなたのLOCAL_MODULE:= test-libsの下にLOCAL_LDLIBSを追加してください。ここでは、コンパイル済みのライブラリをコンパイルするときにリンクしているすべてのライブラリをインクルードする必要があります。例えばので:

LOCAL_LDLIBS := -lgnustl_shared -lgcc -llog -landroid -lstdc++ 

基本的には__cxa_call_unexpected機能が含まれているものを、ライブラリを特定する必要があります。簡単なgoogleは、おそらくlibstdC++であることを示しています。プリコンパイルされたライブラリを作成するときは、このライブラリとリンクしてください。

+0

私はこれを私のApplication.mk APP_STL:= gnustl_sharedに追加しました.LOCAL_LDLIBSに-lgnustl_sharedを追加すると見つかりませんでした。実際、libsディレクトリを見ると、gnustl_sharedはそこにコピーされませんでした。これは、NDK 7b Windowsインストールを使用しています。なぜそれを引っ張っていないのだろうか? NDK 7に問題がありました。おそらくまだ存在しています。 – corbin

+0

libgnustl_shared.soを手作業でやや手作業でコピーして、別のビルド済みのものと同じように扱うことで、すべてが問題なく、私のオリジナルの問題が修正されています。なぜAPP_STL設定を追加するのが私のためにこれをしなかったのかのアイデア。過去の経験から、「必要がある」と言われています。 – corbin

+1

私はあなたに同意する、それは本当に持っている必要があり、私はなぜそれがしないか分からない。それはNDKのバグのように感じます。これのような奇妙なことは、どこでもすべての図書館にリンクさせてくれました。P – Jake

1

例外サポートと何か関係があると思っています。

あなたのコードで例外を使用していますか?そうであれば、例外をサポートする実行時ライブラリでコンパイルしていますか? (および例外を含むコンパイル)?

ndkドキュメントのCPLUSPLUS-SUPPORTファイルとSTANDALONE-TOOLCHAINファイルにはこれ以上のものがあります。

+0

ありがとう、gnustl_sharedにリンクしていないことに関連しているようです。他の回答と私の更新を参照してください。 – corbin

0

Cソースファイル(* .c)のみを含む私のプロジェクトのいずれかが、C++ファイル(* .cpp)を含む別のプロジェクトを参照しているときにも同様の問題が発生しました。両方のプロジェクトのApplication.mkファイルにAPP_STL:= gnustl_sharedがありました。 ndkバージョンはndk7eです。

解決策は、.cファイルのみを含むプロジェクトに空のC++ファイル(dummy.cpp)を追加することでした。おそらくndkはこのプロジェクトがgnustl_sharedとリンクされ、ビルドが成功していることを理解していました。

関連する問題