首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Android的交叉编译libevent

用于Android的交叉编译libevent
EN

Stack Overflow用户
提问于 2012-07-25 18:07:52
回答 3查看 14.5K关注 0票数 6

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

我正在尝试构建的版本是libevent-2.0.19-稳定的

我开始遵循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

经过几次尝试后,我做的最好的方法是运行以下步骤:

代码语言:javascript
复制
1) Install android NDK and download libevent source code

2) Android NDK downloaded and running in ~/android-ndk/android-ndk-r8b

3)执行:

代码语言:javascript
复制
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)使用适当的参数执行./配置:

代码语言:javascript
复制
./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"

在此期间,有人发出警告:

代码语言:javascript
复制
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获得了一个新的http://git.savannah.gnu.org/gitweb/?p=config.git;a=tree和config.sub (在前一个线程中显示在堆栈溢出中)

此时,当构建运行"make“的源代码时,它仍然崩溃:

代码语言:javascript
复制
/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

然而,文件似乎就在那里:

代码语言:javascript
复制
~/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

在运行/配置时,我是否做错了什么?还有一件事我甚至不明白,就是看看Android的NDK文档,是必须创建Android.mk,还是Makefile就足够了

任何帮助都是非常欢迎的!

干杯

N

备注

最后,我就是这样解决这个问题的:

初始路径:

代码语言:javascript
复制
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。在so.o missing for android toolchain (custom build)之后,我们在源文件夹中向它们添加一个sym链接

代码语言:javascript
复制
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 

./配置命令:

代码语言:javascript
复制
./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解决了这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-04 19:37:50

尝尝这个

代码语言:javascript
复制
./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'

对我来说很管用。

票数 4
EN

Stack Overflow用户

发布于 2012-11-02 17:04:01

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2012-11-06 11:54:08

尝试使用以下配置:

代码语言:javascript
复制
ANDROID_SYSROOT=$ANDROID_ROOT/platforms/android-8/arch-arm/

./configure --host=arm-linux-androideabi CFLAGS=--sysroot=$ANDROID_SYSROOT LDFLAGS=--sysroot=$ANDROID_SYSROOT
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11655911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档