我在尝试使用最近的 android-9 x86 平台编译源时遇到问题。
主要问题:为什么静态库libm.a和动态libm.so不同?
问题是我尝试编译:
/path/to/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-gcc --sysroot=/path/to/android-ndk-r8/platforms /android-9/arch-x86 -I/path/to/android-ndk-r8/sources/cxx-stl/gnu-libstdc++/include -I/path/to/android-ndk-r8/sources/cxx-stl /gnu-libstdc++/libs/x86/include -L/path/to/android-ndk-r8/sources/cxx-stl/gnu-libstdc++/lib -L/path/to/android-ndk-r8/platforms/android -9/arch-x86/usr/lib -static /path/to/gcc_4_4_6_release/gcc/testsuite/gcc.dg/complex-5.c -std=c99 -O -ffloat-store -o ./complex-5。 exe-lm
但我有未定义的参考:
/tmp/cc78CsCp.o: 在函数
main': complex-5.c:(.text+0x1a2): undefined reference to
feclearexcept' complex-5.c:(.text+0x1b3): undefined reference to `fetestexcept' collect2: ld 返回 1 exit status密码:/path/to/android-ndk-r8/platforms/android-9/arch-x86/usr/lib
ls libm* libm.a libm.so
它存在,但如果我们用 nm 查找feclearexcept,它不存在于静态库中。
好的,只需尝试删除 -static 标志。
/path/to/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-gcc --sysroot=/path/to/android-ndk-r8/platforms /android-9/arch-x86 -I/path/to/android-ndk-r8/sources/cxx-stl/gnu-libstdc++/include -I/path/to/android-ndk-r8/sources/cxx-stl /gnu-libstdc++/libs/x86/include -L/path/to/android-ndk-r8/sources/cxx-stl/gnu-libstdc++/lib -L/path/to/android-ndk-r8/platforms/android -9/arch-x86/usr/lib /path/to/gcc_4_4_6_release/gcc/testsuite/gcc.dg/complex-5.c -std=c99 -O -ffloat-store -o ./complex-5.exe -流明
好的。问题是:为什么它们不同?我需要静态链接,我不想强制使用-Wl,-Bdynamic -lm的动态链接。顺便说一句:常规的 linux libm.a 和 libm.so 包含类似的函数列表。