首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Android NDK预建静态和共享库时的链接问题

使用Android NDK预建静态和共享库时的链接问题
EN

Stack Overflow用户
提问于 2012-03-20 08:14:34
回答 1查看 3.8K关注 0票数 4

我有一个我正在移植的程序,在创建可执行文件时将多个库链接在一起。我已经使用独立工具链构建了所有这些库,并且使用独立工具链,我能够创建在android设备上工作的可执行文件。所以,看起来我构建的库是有功能的。现在,我正在尝试将这些库整合到一个应用程序中。所以,在我的android.mk中,我有这样的东西:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := sharedA

LOCAL_SRC_FILES := libsharedA.so

include $(PREBUILT_SHARED_LIBRARY)

静态库和其中一个共享库不依赖于任何东西,如果我只包含它们,那么所有这些都是很酷的。一个共享预构建库仅依赖于静态预构建库,其他库依赖于预构建静态库和其他预构建共享库。

问题是,如果我通过System.loadLibrary()加载任何依赖于静态库的函数,我会得到有用的消息:

代码语言:javascript
运行
复制
Unable to dlopen(libsharedA.so) Cannot load library: link_image

深入了解这一点,并遵循这里关于如何使用strace的建议:

http://mpigulski.blogspot.com/2010/09/debugging-dlopen-unsatisfiedlinkerror.html

我发现,当加载共享库时,它们无法定位我的静态库中的函数。

那么,我如何正确地使用一个预先构建的共享库,它的使用依赖于一个预先构建的静态库,并且没有这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-22 18:15:29

共享库不应该依赖于静态库。

静态库用于链接(在编译时)为可执行文件,而不是在运行时添加。

如果您的共享库A使用静态库B,则构建B的共享版本或在将A链接在一起时包含B。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9779815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档