2011-04-01 56 views
1

我很困惑如果我在使用靜態庫時出錯,使用靜態庫構建共享庫的未定義引用錯誤

對於測試, 我想使用靜態庫(mtwist)製作共享庫(pal)。

但我越來越不確定參考靜態庫(mtwist)的功能

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 

**看libmtwist.a已建成但其給出的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) 

這是PAL的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

好它的工作原理,當我包括朋友的Android.mk的mtwist源文件名: \t \t \t。 ./../mtwist-0.7/mtwist.c \ \t \t \t ../../mtwist-0.7/randistrs.c 但我是建設mtwist爲靜態庫,那麼爲什麼我要在這裏提到的源文件再次? 我錯過了什麼?誰能解釋一下? – StarDust 2011-04-01 09:06:16

+1

我有關於靜態庫的問題: 1.我的共享庫(pal)使用靜態庫(mtwist)函數。如果我沒有在我的共享庫(pal)的android.mk中包含mtwist的cpp文件,我得到了未定義的靜態庫函數的引用錯誤,儘管我已經將它包含爲本地靜態庫。 2.如果我在共享庫(pal)的android.mk中包含mtwist的cpp文件,則不會出現錯誤,我不需要使用mtwist.a庫作爲本地靜態庫。 所以我對靜態庫感到困惑。爲什麼我不能使用它,而是必須包含它的所有源文件? – StarDust 2011-04-01 10:38:22

回答

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之前建立朋友,並且我認爲應該把它放在首位。

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

爲什麼使用一些LOCAL_WHOLE_STATIC_LIBRARIES至少沒有記錄在r5b中? (或至少我無法找到]) 我會用這樣的:

LOCAL_SHARED_LIBRARIES := boostthread 
LOCAL_STATIC_LIBRARIES := mtwist 
+0

謝謝,我已經整理出來:) – StarDust 2011-05-07 13:15:51

相關問題