1

私は debian/amd64 を使用しており、NDK-7b を使用して android 2.2 の GMP をクロスコンパイルしたいと考えています。[gmplib](hg clone http://gmplib.org:8000/gmp-5.0 gmp) からソース コードを取得しました。私はそれを設定しました:

./configure --enable-shared --host=arm-linux-androideabi --prefix=/home/fabien/android/spica/ndk-standalone-8 CFLAGS="-v -march=armv5te -mtune=xscale -msoft-float -Wl,-rpath,lib/ -DANDROID -ffunction-sections -funwind-tables -fstack-protector -funswitch-loops -finline-limit=300 -Wall -O3 -nodefaultlibs -fPIC -shared -Wl,--no-allow-shlib-undefined" PKG_CONFIG_PATH="/home/fabien/android/spica/ndk-standalone-8/lib/pkgconfig" LDFLAGS="-Wl,-rpath-link -Wl,/home/fabien/android/spica/ndk-standalone-8/lib -L/home/fabien/android/spica/ndk-standalone-8/lib"

次のように設定して、ファイル config.h を変更しました。

/* Define to 1 if you have the `obstack_vprintf' function. */
#ifndef ANDROID
#define HAVE_OBSTACK_VPRINTF 1
#endif
/* Define to 1 if you have the `localeconv' function. */
#ifndef ANDROID
#define HAVE_LOCALECONV 1
#endif
/* Define to 1 if you have the `vsnprintf' function and it works properly. */
#ifndef ANDROID
#define HAVE_VSNPRINTF 1
#endif

Makefile の SUBDIRS パラメータを次のように更新しました。

 SUBDIRS = tests mpn mpz mpq mpf printf scanf cxx mpbsd demos tune

makeを実行するとコンパイルされるようです:

libtool: link: (cd ".libs" && rm -f "libgmp.so" && ln -s "libgmp.so.10.0.5" "libgmp.so")
libtool: link: ( cd ".libs" && rm -f "libgmp.la" && ln -s "../libgmp.la" "libgmp.la" )

しかし、「make check」を実行すると、リンカーが失われたように見えます。

/../../../../arm-linux-androideabi/bin/ld: warning: ld-linux.so.3, needed by /home/fabien/android/spica/sources/gmp/.libs/libgmp.so, not found (try using -rpath or -rpath-link)
t-bswap.o:(.ARM.exidx.text.main+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
./.libs/libtests.a(misc.o):(.ARM.exidx.text.align_pointer+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
.
.
.
refmpn.c:(.text.refmpn_get_str+0xb8): undefined reference to `__aeabi_uidiv'
refmpn.c:(.text.refmpn_get_str+0x238): undefined reference to `__aeabi_ui2d'
refmpn.c:(.text.refmpn_get_str+0x250): undefined reference to `__aeabi_dmul'
refmpn.c:(.text.refmpn_get_str+0x254): undefined reference to `__aeabi_d2uiz'
./.libs/libtests.a(refmpn.o):(.ARM.exidx.text.refmpn_get_str+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
/home/fabien/android/spica/sources/gmp/.libs/libgmp.so: undefined reference to `abort@GLIBC_2.4'
/home/fabien/android/spica/sources/gmp/.libs/libgmp.so: undefined reference to `puts@GLIBC_2.4'

ヒントはありますか?

4

1 に答える 1

2

このエラーは、リンカーがターゲットを作成するときに、これらのヘルパー関数 (これらは GCC ヘルパー関数) を含むファイルが含まれていないことが原因です。これを修正するには、libgcc.a (GCC ヘルパー関数定義を含む) をリンカー フラグに追加してください。

libgcc.a の場所は、gcc のバージョンを arm-linux-androideabi-4.4.3 とすると、 $NDK_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a

これは次のエラーを修正しません(GNU libc が見つからないことに関連しているようです):

.libs/libgmp.so: undefined reference to `abort@GLIBC_2.4'
.libs/libgmp.so: undefined reference to `puts@GLIBC_2.4'

上記の 2 つのエラーは、Android が GNU libc ではなく Bionic libc を使用しているため、常に表示されます。

注: この方法は、Android だけでなく、すべてのシステムで同様の問題を修正します。

于 2012-04-27T09:34:08.777 に答える