我有一个我正在移植的程序,在创建可执行文件时将多个库链接在一起。我已经使用独立工具链构建了所有这些库,并且使用独立工具链,我能够创建在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
我发现,当加载共享库时,它们无法定位我的静态库中的函数。
那么,我如何正确地使用一个预先构建的共享库,它的使用依赖于一个预先构建的静态库,并且没有这个问题?
发布于 2012-03-22 18:15:29
共享库不应该依赖于静态库。
静态库用于链接(在编译时)为可执行文件,而不是在运行时添加。
如果您的共享库A使用静态库B,则构建B的共享版本或在将A链接在一起时包含B。
https://stackoverflow.com/questions/9779815
复制相似问题