【发布时间】:2012-07-25 18:07:52
【问题描述】:
我一直在尝试将 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? 中描述的步骤进行操作
目标设备是运行 cyanogenMod 7 的三星 Galaxy S2
经过几次尝试,我做的最好的就是运行以下步骤:
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) 之后,我们在源文件夹中添加一个符号链接到它们
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
它曾经在链接阶段崩溃。在 CFLAGS 上包含 -lgcc 解决了这个问题。
【问题讨论】:
-
现在我收到一个错误,它应该与链接器有关:bench_httpclient.c:(.text+0x848): undefined reference to `__aeabi_ldivmod' collect2: ld returned 1 exit status make [3]: *** [bench_httpclient] 错误 1 make[3]: se sale del directorio «/home/narseo/libevent-source/libevent-2.0.19-stable/test» make[2]: *** [ all] 错误 2 make[2]: se sale del directorio «/home/narseo/libevent-source/libevent-2.0.19-stable/test» 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
-
一个简单的:
./configure --build=arm-linux-androideabi为我工作。
标签: android cross-compiling libevent