最近のandroid-9x86プラットフォームでソースをコンパイルしようとしたときに問題が発生しました。
主な質問:静的ライブラリ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 / platform / 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 / platform / 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): `fetestexcept'への未定義の参照collect2:ldが1つの終了ステータスを返しましたpwd:/ path / to / android-ndk-r8 / platform / android-9 / arch-x86 / usr / lib
ls libm * libm.a libm.so
存在しますが、nmでfeclearexceptを探すと、静的ライブラリ内には存在しません。
OK、-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 / platform / 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 / platform / 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- lm
Ok。その質問:なぜそれらは異なるのですか?静的リンケージが必要です。 -Wl、-Bdynamic-lmで動的リンケージを強制的に使用したくありません。ちなみに、通常のlinux libm.aとlibm.soには、同様の関数のリストが含まれています。