android - undefined reference 错误使用静态库构建共享库

标签 android android-ndk

如果我在使用静态库时做错了什么,我会很困惑。

为了测试, 我正在尝试使用静态库 (mtwist) 创建共享库 (pal)。

但是我得到了对静态库(mtwist)函数的 undefined reference

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 函数提供了 undefined reference ,但它已被构建。

这是 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(Shared 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

最佳答案

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

您是否尝试为我更改构建顺序?看起来您尝试在 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? (或者至少我找不到;]) 我会使用这样的东西:

LOCAL_SHARED_LIBRARIES := boostthread
LOCAL_STATIC_LIBRARIES := mtwist

关于android - undefined reference 错误使用静态库构建共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5511076/

相关文章:

android - 编译 vlc-android 不工作 - 找不到 iconv

Android 无法加载本地 libcrypto 未满足的链接错误

android-ndk - 如何使用 eclipse 安装和构建 NDK?

android - 如何在微调器中添加提示

android - Android中元素列表的结构

Android 测试项目崩溃,错误 "Test run failed: Instrumentation run failed due to ' 进程崩溃 .'"

android - 谷歌地图 Android API v2 : GoogleMap is null

android - 谷歌地图 getMapAsync() NullPointerException

android - 如何构建ndk应用程序?

c++11 - 使用 crystax NDK 为 arm 进行交叉编译