Кросс-компиляция 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 (указан в предыдущем потоке в стеке Переполнение)

На данный момент при сборке исходного кода с помощью make все еще происходит сбой:

/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

Примечание

Вот как мне удалось решить это в конце:

Начальный ПУТЬ:

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 решило проблему.


person Narseo    schedule 25.07.2012    source источник
comment
Возможный обман: stackoverflow.com/questions/6881164/   -  person Reno    schedule 26.07.2012
comment
Теперь я получаю сообщение об ошибке, которое должно быть связано с компоновщиком: Bench_httpclient.c:(.text+0x848): неопределенная ссылка на `__aeabi_ldivmod' collect2: ld вернул 1 статус выхода make[3]: *** [ Bench_httpclient] Ошибка 1 make[3]: se sale del directory «/home/narseo/libevent-source/libevent-2.0.19-stable/test» make[2]: *** [все] Ошибка 2 make[2] : se sale del directory «/home/narseo/libevent-source/libevent-2.0.19-stable/test» make[1]: *** [all-recursive] Ошибка 1 make[1]: se sale del directory « /home/narseo/libevent-source/libevent-2.0.19-stable» make: *** [все] Ошибка 2   -  person Narseo    schedule 26.07.2012
comment
Простое: ./configure --build=arm-linux-androideabi сработало для меня.   -  person EntangledLoops    schedule 06.10.2015


Ответы (3)


Попробуй это

./configure --host=arm-linux-androideabi CC="$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT" CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16'

Меня устраивает.

person Kumar Sukhani    schedule 04.12.2012
comment
Почему softfp, а не hard? (Кроме того, вам не нужно $SYSROOT, а +1 за показ.) - person EntangledLoops; 06.10.2015

Этот проект создает libevent как статическую библиотеку для Android здесь: https://github.com/ventureresearch/libevent

Он включает в себя Android.mk и сгенерированные файлы конфигурации для его чистой сборки.

Обратите внимание, что мы собираем его для включения в образ устройства Android, а НЕ собираем через NDK. Вероятно, это все еще было бы хорошим местом для начала.

person Kevin Baker    schedule 02.11.2012
comment
Это действительно очень помогает мне! Спасибо! - person xpol; 06.03.2015

Попробуйте с приведенными ниже конфигурациями:

ANDROID_SYSROOT=$ANDROID_ROOT/platforms/android-8/arch-arm/

./configure --host=arm-linux-androideabi CFLAGS=--sysroot=$ANDROID_SYSROOT LDFLAGS=--sysroot=$ANDROID_SYSROOT
person Pulsar    schedule 06.11.2012
comment
Примененная конфигурация: home/esumitmac/Загрузки/android-ndk-r14b/platforms/android-22/arch-arm При создании: Makefile:1718: рецепт для цели 'bufferevent.lo' не удалось выполнить [1]: *** [bufferevent.lo] Ошибка 1 make[1]: Выход из каталога '/home/esumitmac/work/LibEvent/libevent-2.1.8-stable' Makefile:1248: рецепт для цели 'все' не удалось сделать: *** [все] Ошибка 2 esumitmac@ esumitmac-VirtualBox: - person Sumit Arora; 16.05.2017