Kompilacja krzyżowa libevent dla Androida
Utknąłem przy próbie kompilacji libevent na Androida i chciałbym wiedzieć, co robię źle i uzyskać pomoc.
Wersja, którą próbuję zbudować, to libevent-2.0.19-stable
Zacząłem postępować według kroków opisanych w punkciehttp://warpedtimes.wordpress.com/2010/02/03/building-open-source-libraries-with-android-ndk/ ijak przepisać Makefile na android.mk?
Urządzenie docelowe to Samsung Galaxy S2 z systemem cyanogenMod 7
Po kilku próbach najlepiej zrobiłem, wykonując następujące kroki:
1) Install android NDK and download libevent source code
2) Android NDK downloaded and running in ~/android-ndk/android-ndk-r8b
3) Wykonaj:
export ANDROID_ROOT=~/android-ndk/android-ndk-r8b
export PATH=$PATH:$ANDROID_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/
Musisz wyeksportować ABI dla swojego urządzenia. armeabi-v7a jest przeznaczony dla urządzeń z ARMv7 lub nowszym, każde inne urządzenie używa armeabi.
4) Wykonaj ./configure z odpowiednimi parametrami:
./configure \
--host=arm-linux-androideabi \
CC=arm-linux-androideabi-gcc \
LD=arm-linux-androideabi-ld \
CPPFLAGS="-I$ANDROID_ROOT/platforms/android-8/arch-arm/usr/include/" \
CFLAGS="-nostdlib" \
LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/ -L$ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/" \
LIBS="-lc"
W międzyczasie pojawiło się ostrzeżenie:
configure: WARNING: if you wanted to set the --build type, don't use --host.
If a cross compiler is detected then cross compile mode will be used
(Zakładam, że wszystko jest w porządku)
Ponieważ nie rozpoznał arm-linux-androideabi jako hosta, otrzymałem nowy plik config.guess i config.sub zhttp://git.savannah.gnu.org/gitweb/?p=config.git;a=tree (wskazane w poprzednim wątku w przepełnieniu stosu)
W tym momencie, podczas budowania kodu źródłowego uruchomionego „make”, nadal ulega on awarii:
/home/narseo/android-ndk/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: crtbegin_so.o: No such file: No such file or directory
collect2: ld returned 1 exit status
make[2]: *** [libevent.la] Error 1
make[2]: se sale del directorio «/home/narseo/libevent-source/libevent-2.0.19-stable»
make[1]: *** [all-recursive] Error 1
make[1]: se sale del directorio «/home/narseo/libevent-source/libevent-2.0.19-stable»
make: *** [all] Error 2
Jednak wydaje się, że plik tam jest:
~/android-ndk$ ls $ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib
crtbegin_dynamic.o libc.a libjnigraphics.so libstdc++.so
crtbegin_so.o libc.so liblog.so libthread_db.so
crtbegin_static.o libdl.so libm.a libz.so
crtend_android.o libGLESv1_CM.so libm.so
crtend_so.o libGLESv2.so libstdc++.a
Czy jest coś, co robię źle podczas uruchamiania ./configure? Czegoś innego, czego nie rozumiałem, nawet patrząc na dokumentację NDK Androida, to to, czy konieczne było utworzenie Android.mk lub czy Makefile był wystarczający
Każda pomoc będzie bardzo mile widziana!
Twoje zdrowie
N
UwagaW ten sposób udało mi się go rozwiązać w końcu:
Początkowa ścieżka:
export ANDROID_ROOT=~/android-ndk/android-ndk-r8b
export PATH=$PATH:$ANDROID_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/
export PATH=$PATH:$ANDROID_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/include/
Błędy wydają się występować w fazie łączenia, więc nie mogą znaleźć crtend_so.o i crtbegin_so.o. Następującycrtbegin_so.o brakuje dla android toolchain (niestandardowa kompilacja), dodajemy do nich dowiązanie sym w folderze źródłowym
cd source && ln -s $ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/crtbegin_so.o
ln -s $ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/crtend_so.o
Polecenie ./configure:
./configure \
--host=arm-linux-androideabi \
CC=arm-linux-androideabi-gcc \
LD=arm-linux-androideabi-ld \
CPPFLAGS="-I$ANDROID_ROOT/platforms/android-8/arch-arm/usr/include/" \
CFLAGS="-nostdlib" \
LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/ -L$ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/" \
LIBS="-lc"
Jeśli nie powiedzie się, ponieważ nie rozpoznaje systemu androideabi, spróbuj uzyskać nowsze wersje config.sub i config.guess
Kiedyś się zawieszało w fazie łączenia. Włączenie opcji -lgcc do CFLAGS rozwiązało problem.