Linking issue when prebuilt static and shared libraries with the Android NDK

故事扮演 提交于 2019-12-22 08:34:40

问题


I have a program I am porting that links together multiple libraries when creating the executable. I have built all those libraries using the stand alone toolchain and using the standalone toolchain I am able to create an executable that works on an android device. So, it seems like the libraries I have built are functional. Now I am trying to incorporate those libraries with an app. So, in my android.mk I have something like this:

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)

For each of the libraries, I have a Android.mk like this

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := sharedA

LOCAL_SRC_FILES := libsharedA.so

include $(PREBUILT_SHARED_LIBRARY)

The static library and one of the shared libraries have no dependencies on anything and if I only include them all is cool. One shared prebuilt library is dependent on the static prebuilt library only and the others are dependent on the prebuilt static library and other prebuilt shared libraries.

The problem is if I load any that are dependent on the static library via System.loadLibrary() I get the useful message:

Unable to dlopen(libsharedA.so) Cannot load library: link_image

Digging through this and following the suggestions here about how to use strace:

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

I found that when the shared libraries are loaded, they cannot locate a function that is in my static library.

So, how do I correctly use a prebuilt shared library whose use is dependent on a prebuilt static library and not have this issue?


回答1:


Shared libraries should not depend on static libraries.

Static libraries are for linking (at compile-time) into an executable, not for adding at runtime.

If your shared library A uses a static library B, then either build a shared version of B or include B when you link A together.



来源:https://stackoverflow.com/questions/9779815/linking-issue-when-prebuilt-static-and-shared-libraries-with-the-android-ndk

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!