2011-01-22 3 views
11

공유 라이브러리로 라이브러리를 만드는 작업을 시작했지만 공유 라이브러리 하나와 나머지 정적 라이브러리를 만드는 것이 더 효율적이라고 생각했습니다. 그것이 모두 공유되었을 때 컴파일되고 잘 링크되었지만 정적으로 이동하면 "정의되지 않은 참조"와 연결됩니다.Android NDK, 2 개의 정적 라이브러리 및 링크

편집 : 나는 하나 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 

및 오류가

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

, 당신은 적절한 호출 정적 라이브러리를 참조하고 있는지 확인하십시오

LOCAL_STATIC_LIBRARIES := mystaticlibproj 

$(BUILD_SHARED_LIBRARY)을 포함 호출하기 전에. 여전히 문제가있는 경우 자세한 빌드 로그 (ndk-build V=1 -B)와 Android.mk

을 게시

$(call import-module, mystaticlibproj) 

그런 다음 파일의 끝에서, 정적 LIB 모듈을 가져 오기 위해 전화를 걸

+0

나는 하나의 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