我有一个移植的程序,在创建可执行文件时将多个库链接在一起。我使用独立的工具链构建了所有这些库,并使用独立的工具链,我能够创建一个可在Android设备上运行的可执行文件。所以,我构建的库似乎是功能性的。现在我正在尝试将这些库与应用程序合并。所以,在我的android.mk中我有这样的东西:
LOCAL_PATH := $(call my-dir)
ROOT_PATH := $(LOCAL_PATH)
include $(call all-subdir-makefiles)
include $(CLEAR_VARS)
LOCAL_PATH = $(ROOT_PATH)
LOCAL_MODULE := test-libs
LOCAL_STATIC_LIBRARIES := staticA
LOCAL_SHARED_LIBRARIES := sharedA sharedB sharedC sharedD
LOCAL_SRC_FILES := test-libs.c
include $(BUILD_SHARED_LIBRARY)
对于每个库,我都有像这样的Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := sharedA
LOCAL_SRC_FILES := libsharedA.so
include $(PREBUILT_SHARED_LIBRARY)
静态库和其中一个共享库没有任何依赖关系,如果我只包含它们,那么一切都很酷。一个共享的预构建库仅依赖于静态预构建库,而其他库依赖于预构建的静态库和其他预构建的共享库。
问题是如果我通过System.loadLibrary()加载任何依赖于静态库的东西,我会收到有用的消息:
Unable to dlopen(libsharedA.so) Cannot load library: link_image
深入研究并遵循以下有关如何使用strace的建议:
http://mpigulski.blogspot.com/2010/09/debugging-dlopen-unsatisfiedlinkerror.html
我发现加载共享库时,它们无法找到静态库中的函数。
那么,我如何正确使用预先构建的共享库,其使用依赖于预构建的静态库而没有此问题?
答案 0 :(得分:4)
共享库不应该依赖于静态库。
静态库用于链接(在编译时)到可执行文件,而不是用于在运行时添加。
如果您的共享库A使用静态库B,则在您将A链接在一起时构建B的共享版本或包含B.