0

我试图了解一个不满意的链接错误。这是我正在观察的问题。

我有一个名为libmynative.so. libmynative.so依赖于另一个名为 的原生 C++ 库libothernative.so,而另一个原生依赖于 STLPort。所以我的loadLibrary链看起来像:

static {
    System.loadLibrary("stlport_shared");
    System.loadLibrary("othernative");
    System.loadLibrary("mynative");
}

由于不满意的链接错误,加载libothernative.so失败,但缺少的符号由libstlport_shared.so(已加载!)提供。

但是,如果libmynative.solibothernative.a行(注意静态库),则loadLibrary链看起来像:

System.loadLibrary("stlport_shared");
System.loadLibrary("mynative");

然后一切顺利。我libmynative.so仍然需要 提供的符号libstlport_shared.so,但没有错误。

什么可以解释这种行为?System.loadLibrary可以调用的数量是否有深度限制?


以下是没有答案的相关问题:

来自 Google NDK 用户组:

4

1 回答 1

0

我能够将其归结为缺少的依赖项。

下面,在构建共享对象时,我曾经--sysroot包含头文件和库路径。我libstlport_shared.so也在$(LDLIBS). 但是,构建共享对象的命令不包括$(LDFLAGS)and $(LDLIBS)(其他人编写了 makefile)。

Readelf 显示它丢失了:

$ arm-linux-androideabi-readelf -d libcryptopp.so

Dynamic section at offset 0x34472c contains 26 entries:
 Tag        Type                         Name/Value
 0x00000003 (PLTGOT)                     0x346e30
 0x00000002 (PLTRELSZ)                   904 (bytes)
 ...
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
...

$ make static dynamic
arm-linux-androideabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM
--sysroot=/opt/android-ndk-r9/platforms/android-14/arch-arm
-I/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/ -c 3way.cpp
arm-linux-androideabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM
--sysroot=/opt/android-ndk-r9/platforms/android-14/arch-arm
-I/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/ -c adler32.cpp
arm-linux-androideabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM
--sysroot=/opt/android-ndk-r9/platforms/android-14/arch-arm
-I/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/ -c algebra.cpp
...

arm-linux-androideabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM
--sysroot=/opt/android-ndk-r9/platforms/android-14/arch-arm
-I/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/ -shared -o libcryptopp.so
3way.o adler32.o algebra.o algparam.o arc4.o asn.o authenc.o base32.o base64.o
... wait.o wake.o whrlpool.o xtr.o xtrcrypt.o zdeflate.o zinflate.o zlib.o
...
于 2014-09-01T06:44:54.453 回答