4

FooMain と FooSecondary の 2 つの異なるライブラリのソース コードがあります。FooSecondary は FooMain によって使用されるため、makefile は最初に FooSecondary をコンパイルし、次に FooMain をコンパイルし、次に FooSecondary を FooMain にリンクする必要があります。

私の Android.mk は次のとおりです。

LOCAL_PATH:= $(my-dir を呼び出す)

# Foo 二次ライブラリ:

# 変数をクリア
$(CLEAR_VARS) を含める
# ターゲット ビルド
LOCAL_ARM_MODE := アーム   
# ライブラリ名          
LOCAL_MODULE := FooSecondary        
# すべての SRC_FILES をまとめて設定            
SRC_FILES := $(ワイルドカード $(LOCAL_PATH)/FooSecondary/src/*.c)
SRC_FILES := $(SRC_FILES:$(LOCAL_PATH)/%=%)     
LOCAL_SRC_FILES = $(SRC_FILES)
# ログサポートを有効にする
LOCAL_LDLIBS = -llog    
# C フラグ - 最大最適化              
LOCAL_CFLAGS := -O3 -mno-thumb
# C++ フラグ - 最大最適化          
LOCAL_CPPFLAGS := -O3 -mno-親指
# 共有ライブラリとしてコンパイル     
$(BUILD_SHARED_LIBRARY) を含める     

# Foo 二次ライブラリ:

# 変数をクリア
$(CLEAR_VARS) を含める
# OpenCV を含める
サードパーティ/OpenCV-2.4.3-rc-android-sdk/sdk/native/jni/OpenCV.mk を含める
# ターゲット ビルド
LOCAL_ARM_MODE := アーム   
# ライブラリ名          
LOCAL_MODULE := FooMain     
# すべての SRC_FILES をまとめて設定            
SRC_FILES := $(ワイルドカード $(LOCAL_PATH)/FooMain/src/*.cpp)
SRC_FILES := $(SRC_FILES:$(LOCAL_PATH)/%=%)     
LOCAL_SRC_FILES = $(SRC_FILES)
LOCAL_SHARED_LIBRARIES := libFooSecondary
LOCAL_LDLIBS := -L$(LOCAL_PATH)/../libs/armeabi
LOCAL_LDLIBS += -lz -lm -ldl -lGLESv2 -lEGL -llog -lFooSecondary
LOCAL_CFLAGS := -O2 -mno-thumb -Wno-write-strings
LOCAL_CPPFLAGS := -O2 -mno-thumb -Wno-write-strings
# 共有ライブラリとしてコンパイル     
$(BUILD_SHARED_LIBRARY) を含める

そして、私の Application.mk は次のとおりです。

APP_CPPFLAGS := -frtti -fexceptions
APP_STL := gnustl_static
APP_ABI := armeabi-v7a

しかし、ndk-build を使用して Android.mk をコンパイルすると、次のエラーが発生します。

Compile arm    : libFooSecondary <= *.c
SharedLibrary  : libFooSecondary.so
Install        : libFooSecondary.so => libs/armeabi-v7a/libFooSecondary.so
SharedLibrary  : libFooMain.so

/home/user/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lFooSecondary

collect2: ld returned 1 exit status
make: *** [obj/local/armeabi-v7a/libFooMain.so] Error 1

libFooSecondary.so が正しくコンパイルおよびインストールされているのに、なぜ libFooSecondary.so が見つからないのですか?

さらに、LOCAL_MODULE の名前が変更された場合、たとえば、最初の名前が LOCAL_MODULE := zname で、2 番目の名前が LOCAL_MODULE := aname の場合、最初に 2 番目の名前をコンパイルします。理由はわかりません。

4

2 に答える 2

5

あなたAndroid.mkは奇妙に見えます。LOCAL_PATHそれはどこかに割り当てられますか?ndk-build は両方のフラグ セットを C++ コマンド ラインに配置するため、LOCAL_CPPFLAGSduplicateに割り当てる必要はありません。LOCAL_CFLAGS

NDK がApplication.mkAndroid.mkを解釈する方法をよりよく理解するには、次のコマンドを実行します。

ndk-build V=1

これにより、コンパイルとリンクを含む実行されたすべてのコマンドが、NDK ビルドによって割り当てられるすべてのパラメーターとともにエコーされます。

于 2012-10-29T21:57:38.367 に答える
2

FooSecondary を静的ライブラリとしてコンパイルして、FooMain に次のように含めてみてください: LOCAL_STATIC_LIBRARIES := libFooSecondary

複数の共有ライブラリが dlopen されていない限り、ndk はうまく動作しません。

于 2012-10-30T07:53:33.807 に答える