2011-01-22 48 views
11

私は共有ライブラリとしてライブラリを作成し始めましたが、1つの共有ライブラリと残りの静的ライブラリを作成する方が効率的だと考えました。それがすべて共有されたとき、それはコンパイルされ、うまくリンクされましたが、静的に移動すると、私は "未定義の参照"をリンクします。Android NDK、2つの静的ライブラリとリンク

編集:私は1 Android.mk

Android.mk内のすべてのライブラリの構築:

MY_LOCAL_PATH := $(call my-dir) 
MY_LOCAL_CFLAGS := -DDEBUG 

TARGET_PLATFORM := 'android-4' 

LOCAL_PATH := $(MY_LOCAL_PATH)/../../Base 

include $(CLEAR_VARS) 

LOCAL_MODULE  := Base 
LOCAL_SRC_FILES := <Base src files> 
include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES := Base 

MY_LOCAL_C_INCLUDES := $(MY_LOCAL_PATH)/../../Base 

LOCAL_PATH := $(MY_LOCAL_PATH)/../../Framework 

include $(CLEAR_VARS) 

LOCAL_MODULE  := Framework 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 
LOCAL_SRC_FILES := <Framework src files> 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 

include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES += Framework 

MY_LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/../../Framework 

LOCAL_PATH := $(MY_LOCAL_PATH)/Graphics 

include $(CLEAR_VARS) 

LOCAL_MODULE := Graphics 
LOCAL_SRC_FILES := <Graphics src files> 
LOCAL_EXPORT_LDLIBS := -lGLESv1_CM 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 

include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES += Graphics 

MY_LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/Graphics 

LOCAL_PATH := $(MY_LOCAL_PATH)/Platform 

include $(CLEAR_VARS) 

LOCAL_MODULE := Platform 
LOCAL_SRC_FILES := <Platform src files> 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 

include $(BUILD_STATIC_LIBRARY) 

MY_LOCAL_STATIC_LIBRARIES += Platform 

MY_LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/Platform 

LOCAL_PATH := $(MY_LOCAL_PATH) 

include $(CLEAR_VARS) 

LOCAL_MODULE := Final 
LOCAL_SRC_FILES := <Final src files> 
LOCAL_STATIC_LIBRARIES := $(MY_LOCAL_STATIC_LIBRARIES) 
LOCAL_LDLIBS := -llog 
LOCAL_CFLAGS := $(MY_LOCAL_CFLAGS) 
LOCAL_C_INCLUDES := $(MY_LOCAL_C_INCLUDES) 

include $(BUILD_SHARED_LIBRARY) 

ndk-build V=1 -Bの最後の行:

SharedLibrary : libFinal.so 
/Users/robbie/Library/Frameworks/Android-NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ -Wl,-soname,libFinal.so -shared --sysroot=/Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm <object files> /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libBase.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libFramework.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libGraphics.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libPlatform.a /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libstdc++.a /Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib/libc.so /Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib/libstdc++.so /Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib/libm.so -Wl,--no-undefined -Wl,-z,noexecstack -L/Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib -llog -lGLESv1_CM -lstdc++ -Wl,-rpath-link=/Users/robbie/Library/Frameworks/Android-NDK/platforms/android-4/arch-arm/usr/lib -lsupc++ -o /Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libFinal.so 
/Users/robbie/Documents/Apps/Revolution/Android/obj/local/armeabi/libPlatform.a(ATexture.o): In function `ATexture': 
/Users/robbie/Documents/Apps/Revolution/Android/jni/SpinTap/ATexture.cpp:9: undefined reference to `TextureRenderer::TextureRenderer(unsigned int)' 
/Users/robbie/Documents/Apps/Revolution/Android/jni/SpinTap/ATexture.cpp:9: undefined reference to `TextureRenderer::TextureRenderer(unsigned int)' 

EDIT2: TextureRendererが入っています含まれるグラフィックス。

なぜ誰かがそれが動作していない可能性があり、それを修正する方法を知っていますか?あなたのAndroid.mk

+0

System.loadLibrary()をもう一度タイプするだけでなく、多くの共有ライブラリに利点がありますか? – NebulaFox

+0

私はあなたの問題を抱えていませんでした、私はちょうどリンクする静的ライブラリを生成する方法を知らなかった。この例をありがとう。 –

答えて

12

これは私にリンクオーダーの問題のようです。

あなたのコマンドラインは次のとおりです。

arm-linux-androideabi-g++ -Wl,-soname,libFinal.so -shared \ 
    libBase.a libFramework.a libGraphics.a libPlatform.a -o libFinal.so 

とエラーがTextureRendererがグラフィックスである

libPlatform.a(ATexture.o): In function `ATexture': 
ATexture.cpp:9: undefined reference to `TextureRenderer' 
ATexture.cpp:9: undefined reference to `TextureRenderer' 

です。しかし、libGraphicsはコマンドラインでlibPlatformの前にあります。 g ++はコマンドライン上の各ライブラリを指定された順序で検索し、外部参照を解決する関数をロードします。 libGraphicsを一度読み込み、外部参照を解決してlibPlatformに移動する関数をロードします。

LOCAL_STATIC_LIBRARIES := $(MY_LOCAL_STATIC_LIBRARIES)LOCAL_STATIC_LIBRARIES := Platform Graphics Framework Baseに変更してください。

2

、あなたは適切な呼び出しで静的ライブラリを参照していることを確認してください。

LOCAL_STATIC_LIBRARIES := mystaticlibproj 

$(BUILD_SHARED_LIBRARY)が含ま呼び出す前に。それでも問題が解決しない場合は、詳細なビルドログ(ndk-build V=1 -B)とあなたのAndroid.mk

を投稿

$(call import-module, mystaticlibproj) 

次に、ファイルの末尾に、静的libにモジュールをインポートするために電話をかけます

+0

私は1つのAndroid.mk内のすべてのライブラリをコンパイルすると述べておくべきです。 – NebulaFox

+0

まず、TextureRendererが確かにlibGraphics.aであることを再確認します。 /Users/robbie/Library/Frameworks/Android-NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-nmライブラリにシンボルをダンプするには – levis501

関連する問題