2011-01-22 14 views
11

मैंने पुस्तकालयों को साझा पुस्तकालयों के रूप में बनाना शुरू कर दिया, लेकिन मुझे लगता है कि यह एक साझा पुस्तकालयों और बाकी स्थिर बनाने के लिए और अधिक कुशल होगा। जब यह सब साझा किया गया था, तो यह संकलित और जुड़ा हुआ जुड़ा हुआ था, लेकिन स्थैतिक पर जाने के लिए, मैं "अपरिभाषित संदर्भ" को जोड़ने पर मिलता हूं।एंड्रॉइड एनडीके, दो स्टेटिक लाइब्रेरीज़ और लिंकिंग

संपादित करें: मैं एक 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 में है ग्राफिक्स, जो शामिल है।

क्या किसी को पता है कि यह क्यों काम नहीं कर रहा है और इसे कैसे ठीक किया जाए?

+0

क्या कई सिस्टम.लोड लाइब्रेरी() टाइप करने के अलावा कई लोगों पर एक साझा लाइब्रेरी का कोई लाभ है? – NebulaFox

+0

मुझे आपकी समस्या नहीं थी, मुझे पता नहीं था कि लिंक करने के लिए स्थिर लाइब्रेरी कैसे उत्पन्न करें। उदाहरण के लिए धन्यवाद। –

उत्तर

12

यह मेरे लिए ऑर्डर-ऑफ-लिंकिंग समस्या जैसा दिखता है।

आपका आदेश पंक्ति है:

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

और त्रुटि

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

TextureRenderer ग्राफिक्स में है। लेकिन libGraphics कमांड लाइन पर libPlatform से पहले है। g ++ प्रत्येक लाइब्रेरी को कमांड लाइन पर दिए गए क्रम में, बाहरी संदर्भों को हल करने के लिए फ़ंक्शन लोड करने पर खोज करेगा। यह एक बार libGraphics पढ़ेगा, बाहरी संदर्भों को हल करने वाले कार्यों को लोड करें और libPlatform पर आगे बढ़ें।

LOCAL_STATIC_LIBRARIES := $(MY_LOCAL_STATIC_LIBRARIES) से LOCAL_STATIC_LIBRARIES := Platform Graphics Framework Base को बदलने का प्रयास करें और देखें कि आप कैसे चलते हैं।

2

अपने Android.mk में, सुनिश्चित करें कि आप उचित कॉल के साथ स्थिर पुस्तकालय संदर्भित कर रहे हैं बनाने:

LOCAL_STATIC_LIBRARIES := mystaticlibproj 

बुला $(BUILD_SHARED_LIBRARY) शामिल करने से पहले।

फिर, फ़ाइल के अंत में, स्थिर lib मॉड्यूल आयात करने के लिए कॉल करने के

$(call import-module, mystaticlibproj) 

आप अभी भी समस्या हो रही है, वर्बोज़ निर्माण लॉग (ndk-build V=1 -B) और अपने Android.mk

पोस्ट
+0

मुझे बताया जाना चाहिए कि मैं एक एंड्रॉइड.एमके – 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

संबंधित मुद्दे