我很困惑如果我在使用靜態庫時出錯,使用靜態庫構建共享庫的未定義引用錯誤
對於測試, 我想使用靜態庫(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
好它的工作原理,當我包括朋友的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.我的共享庫(pal)使用靜態庫(mtwist)函數。如果我沒有在我的共享庫(pal)的android.mk中包含mtwist的cpp文件,我得到了未定義的靜態庫函數的引用錯誤,儘管我已經將它包含爲本地靜態庫。 2.如果我在共享庫(pal)的android.mk中包含mtwist的cpp文件,則不會出現錯誤,我不需要使用mtwist.a庫作爲本地靜態庫。 所以我對靜態庫感到困惑。爲什麼我不能使用它,而是必須包含它的所有源文件? – StarDust 2011-04-01 10:38:22