2011-04-01 3 views
1

정적 라이브러리를 사용하는 중에 문제가 발생하면 혼란 스럽습니다.정적 라이브러리를 사용하여 공유 라이브러리를 작성하는 중 정의되지 않은 참조 오류가 발생했습니다.

테스트를 위해 정적 라이브러리 (mtwist)를 사용하여 공유 라이브러리 (pal)를 만들려고합니다.

그러나 나는 그것이 mtwist 기능에 대한 정의되지 않은 참조를 제공하지만 ** 룩 libmtwist.a가 구축 된

Compile thumb : mtwist <= mtwist.c 
Compile thumb : mtwist <= randistrs.c 
StaticLibrary : libmtwist.a 
SharedLibrary : libpal.so 
F:/afe/obj/local/armeabi/objs-debug/pal/PALrandom.o: In function `CRandom': 
F:/afe/jni/PAL/Sources/PALrandom.cpp:47: undefined reference to `mts_seed' 
F:/afe/jni/PAL/Sources/PALrandom.cpp:48: undefined reference to `mts_mark_initialized' 
F:/afe/jni/PAL/Sources/PALrandom.cpp:47: undefined reference to `mts_seed' 
F:/afe/jni/PAL/Sources/PALrandom.cpp:48: undefined reference to `mts_mark_initialized' 
F:/afe/obj/local/armeabi/objs-debug/pal/PALrandom.o: In function `PAL::CRandom:: 
GetRandomInteger16()': 
F:/afe/jni/PAL/Sources/PALrandom.cpp:60: undefined reference to `rds_iuniform' 
F:/afe/obj/local/armeabi/objs-debug/pal/PALrandom.o: In function `PAL::CRandom::GetRandomInteger32()': 
F:/afe/jni/PAL/Sources/PALrandom.cpp:67: undefined reference to `rds_iuniform' 
F:/afe/jni/PAL/Sources/PALrandom.cpp:69: undefined reference to `rds_iuniform' 
collect2: ld returned 1 exit status 
make: *** [/cygdrive/f/afe/obj/local/armeabi/libpal.so] Error 1 

정적 라이브러리 (mtwist)의 기능에 대한 정의되지 않은 참조를 얻고있다.

이것은 Android.mk 파일 mtwist (정적 라이브러리)입니다 :

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := mtwist 
LOCAL_SRC_FILES := mtwist.c \ 
      randistrs.c \ 
include $(BUILD_STATIC_LIBRARY) 

이것은 친구의 Android.mk 파일 (공유 라이브러리)입니다 :이 메인

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../Headers \ 
    $(LOCAL_PATH)/../../BaseMulti/Headers \ 
    $(LOCAL_PATH)/../../boost \ 
    $(LOCAL_PATH)/../../mtwist-0.7 

LOCAL_CFLAGS += -Wno-deprecated -D_LINUX -DBOOST_HAS_PTHREADS -fexceptions 
LOCAL_MODULE := pal 
LOCAL_SRC_FILES := PALcritsec.cpp \ 
      PALdebug.cpp \ 
      PALdebuglog.cpp \ 
      PALinet.cpp \ 
      PALlocalhostUdpEvent.cpp \ 
      PALnetwork.cpp \ 
      PALpollarray.cpp \ 
      PALprofiler.cpp \ 
      PALrandom.cpp \ 
      PALserializable.cpp \ 
      PALsocket.cpp \ 
      PALstringutil.cpp \ 
      PALsystime.cpp \ 
      PALthread.cpp \ 

LOCAL_SHARED_LIBRARIES := boostthread 
LOCAL_WHOLE_STATIC_LIBRARIES := mtwist 

include $(BUILD_SHARED_LIBRARY) 

입니다 Android.mk 파일 :

ROOT_DIR := $(call my-dir) 
include $(ROOT_DIR)/PAL/Sources/Android.mk 
include $(ROOT_DIR)/mtwist-0.7/Android.mk 
include $(ROOT_DIR)/boost/libs/thread/src/Android.mk 
+0

확인이 작동합니다. ./../mtwist-0.7/mtwist.c \ \t \t \t ../../mtwist-0.7/randistrs.c 내가 여기에 소스 파일을 언급해야하는 이유 그러나 나는 다음과 같은 정적 라이브러리를 mtwist 구축했다 다시? 실종 신고는 무엇입니까? 아무도 설명 할 수 있을까요? – StarDust

+1

정적 라이브러리에 관한 질문이 있습니다. 1. 공유 라이브러리 (pal)는 정적 라이브러리 (mtwist) 함수를 사용합니다. mtwist의 cpp 파일을 내 공유 라이브러리 (pal)의 android.mk에 포함시키지 않으면 정적 라이브러리 함수에 정의되지 않은 참조 오류가 발생하지만 로컬 정적 라이브러리로 포함 시켰습니다. 2. 내 공유 라이브러리 (pal)의 android.mk에 mtwist의 cpp 파일을 포함하면 오류가 없으며 mtwist.a 라이브러리를 사용하여 로컬 정적 라이브러리로 포함 할 필요가 없습니다. 그래서 정적 라이브러리에 대해 혼란스러워합니다. 왜 내가 그것을 사용할 수없는 대신, 그것의 모든 소스 파일을 포함해야합니까? – StarDust

답변

0
include $(ROOT_DIR)/PAL/Sources/Android.mk 
include $(ROOT_DIR)/mtwist-0.7/Android.mk 
include $(ROOT_DIR)/boost/libs/thread/src/Android.mk 

D 이드는 당신이 트라이에게 빌드 순서를 바꾸기 위해 당신이 mtwist 전에 pal를 만들려고하는 것처럼 보입니다. 그리고 나는 boost가 그 위에 있어야한다고 생각합니다.

include $(ROOT_DIR)/boost/libs/thread/src/Android.mk 
include $(ROOT_DIR)/mtwist-0.7/Android.mk 
include $(ROOT_DIR)/PAL/Sources/Android.mk 

그리고 R5B에 적어도 문서화 아니에요 일부 LOCAL_WHOLE_STATIC_LIBRARIES를 사용하는 이유? (또는 적어도 내가 찾을 수 없습니다]) I는 다음과 같이 사용합니다 : \t \t \t : 나는 친구의 Android.mk에서 mtwist 소스 파일 이름을 포함 할 때

LOCAL_SHARED_LIBRARIES := boostthread 
LOCAL_STATIC_LIBRARIES := mtwist 
+0

감사합니다. 이미 정렬했습니다. :) – StarDust

관련 문제