交叉编译libevent for Android

时间:2012-07-25 18:07:53

标签: android cross-compiling libevent

我一直试图将libevent交叉编译到Android,我想知道我做错了什么并获得了一些帮助。

我试图构建的版本是libevent-2.0.19-stable

我开始按照http://warpedtimes.wordpress.com/2010/02/03/building-open-source-libraries-with-android-ndk/how to rewrite the Makefile into android.mk?

中描述的步骤进行操作

目标设备是三星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作为主机,我从http://git.savannah.gnu.org/gitweb/?p=config.git;a=tree获得了一个新的config.guess和config.sub(在Stack Overflow的前一个帖子中指出)

此时,在构建运行" 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是否足够

非常欢迎任何帮助!

干杯

<磷>氮

注意

这就是我最终设法解决的问题:

初始路径:

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 missing for android toolchain (custom build)之后,我们在源文件夹

中添加了一个sym链接
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"

如果因为无法识别system androideabi而失败,请尝试获取较新版本的config.sub和config.guess

它曾经在链接阶段崩溃。在CFLAGS上包含-lgcc解决了这个问题。

3 个答案:

答案 0 :(得分:6)

此项目在此处将libevent构建为Android上的静态库:https://github.com/ventureresearch/libevent

它包含Android.mk和生成的配置文件,以便干净地构建它。

请注意,我们正在构建它以包含在Android设备映像中,而不是通过NDK构建。它可能仍然是一个很好的起点。

答案 1 :(得分:4)

尝试使用以下配置:

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

./configure --host=arm-linux-androideabi CFLAGS=--sysroot=$ANDROID_SYSROOT LDFLAGS=--sysroot=$ANDROID_SYSROOT

答案 2 :(得分:4)

试试这个

./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'

它对我有用。