我正在尝试理解一个不满意的链接错误。这是我正在观察的问题。
我有一个名为libmynative.so
的本机C ++库。 libmynative.so
依赖于另一个名为libothernative.so
的本机C ++库,而另一个本机依赖于STLPort。所以我的loadLibrary
链看起来像:
static {
System.loadLibrary("stlport_shared");
System.loadLibrary("othernative");
System.loadLibrary("mynative");
}
libothernative.so
的加载由于链接错误不满意而失败,但缺失的符号由libstlport_shared.so
提供(已加载!)。
但是,如果libmynative.so
换行libothernative.a
(请注意静态库),以便loadLibrary
链看起来像:
System.loadLibrary("stlport_shared");
System.loadLibrary("mynative");
然后一切都成功了。我的libmynative.so
仍然需要libstlport_shared.so
提供的符号,但没有错误。
有什么可以解释这种行为?可以调用System.loadLibrary
的数量是否有深度限制?
以下是没有答案的相关问题:
来自Google NDK用户群:
答案 0 :(得分:0)
我能够将其追踪到缺失的依赖关系。
下面,在构建共享对象时,我使用--sysroot
来包含头和库路径。我还在libstlport_shared.so
中指定了$(LDLIBS)
。但是,构建共享对象的命令不包括$(LDFLAGS)
和$(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
...