Кросс-компиляция libevent для Android
Я застрял, пытаясь сделать кросс-компиляцию libevent для Android, и мне хотелось бы узнать, что я делаю неправильно, и получить некоторую помощь.
Версия, которую я пытаюсь собрать, является libevent-2.0.19-stable.
Я начал следовать шагам, описанным вhttp://warpedtimes.wordpress.com/2010/02/03/building-open-source-libraries-with-android-ndk/ а такжекак переписать Makefile в android.mk?
Целевое устройство - Samsung Galaxy S2 под управлением CyanogenMod 7
После нескольких попыток лучше всего я выполнил следующие шаги:
1) Install android NDK and download libevent source code
2) Android NDK downloaded and running in ~/android-ndk/android-ndk-r8b
3) Выполнить:
export ANDROID_ROOT=~/android-ndk/android-ndk-r8b
export PATH=$PATH:$ANDROID_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/
Вам необходимо экспортировать ABI для вашего устройства. armeabi-v7a предназначен для устройств с ARMv7 или выше, любое другое устройство использует armeabi.
4) Выполните ./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"
В то же время было предупреждение:
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
(Я предполагаю, что это нормально)
Поскольку он не распознал arm-linux-androideabi в качестве хоста, я получил новые config.guess и config.sub отhttp://git.savannah.gnu.org/gitweb/?p=config.git;a=tree (указано в предыдущей теме в Переполнение стека)
На этом этапе при сборке исходного кода, в котором выполняется & quot; make & quot ;, он все равно вылетает:
/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
Тем не менее, файл, кажется, там:
~/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
Есть ли что-то, что я делаю неправильно при запуске ./configure? Еще одна вещь, которую я не мог понять, даже просматривая документацию Android NDK, заключалась в том, было ли обязательным создание Android.mk или достаточно ли Makefile
Любая помощь будет очень кстати!
ура
N
NoteВот как мне удалось решить это в итоге:
Начальный путь
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/
Кажется, что ошибки возникают на этапе компоновки, так как он не может найти crtend_so.o и crtbegin_so.o. Следующийcrtbegin_so.o отсутствует для набора инструментов Android (пользовательская сборка)мы добавляем ссылку на них в исходную папку
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
Команда ./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"
Если это не удается, так как он не распознает систему androideabi, попробуйте получить более новые версии config.sub и config.guess
Раньше сбой на этапе связывания. Включение -lgcc в CFLAGS решило проблему.