8

最近の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 tofeclearexcept'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には、同様の関数のリストが含まれています。

4

0 に答える 0