摘要:前言这是系列文章,它们由编译可在上运行的库及其他篇文章组成,这篇文章在编译依赖库一节中列出。编译环境本文在位系统上对项目进行交叉编译。约定下文中的若无特殊说明均指。运行在源码根目录下输入命令该脚本执行成功时,会生成一个名为的脚本文件。
前言
这是系列文章,它们由《编译可在Android上运行的glib库》及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出。由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库交叉编译到Android平台上才能成功的编译glib库,系列文章中除《编译可在Android上运行的glib库》外的其他交叉编译文章均是介绍如何对glib依赖库进行交叉编译。以上,所以叫系列文章,因为这些文章完整的介绍了如何编译可在Android上运行的glib库。
文章价值
这些文章的核心价值是Android平台的交叉编译经验和提供了新的编译方式。有些人把linux库移植到Android上的时候将makefile翻译为Android.mk文件(据我所知有不少人都是这样做的),而使用本文中的方法可以直接利用原有的makefile文件进行交叉编译。
编译环境
本文在Ubuntu 64位系统上对glib项目进行交叉编译。
约定
下文中的"NDK"若无特殊说明均指"Android NDK"。
步骤 1.下载并安装Android NDK下载并安装Android NDK的过程在这里不做介绍。
下载gitlib
git clone https://github.com/GNOME/glib.git2.安装必要工具
GNU autoconf 2.62 GNU automake 1.11 GNU libtool 2.2 GNU gettext 0.10.40 pkg-config 0.16 gtk-doc libffi 3.0.0
关于编译glib项目要安装的工具可以参考glib源码根目录下的HACKING文件。
3.设置NDK和SYSROOT环境变量设置NDK环境变量
export NDK=export PATH=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
在"$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin"目录中包含了arm-linux-androideabi-gcc、arm-linux-androideabi-g++等交叉编译工具,不过交叉编译工具的路径根据NDK版本和编译工具版本的不同会有所变化。
设置SYSROOT环境变量
export SYSROOT="$NDK/platforms/android-21/arch-arm"
SYSROOT表示一个目录,该目录中包含了目标的系统头文件和库,在当前上下文语境中目标表示的是arm cpu架构。路径中的"android-21"表示Android API级别,其中21表示的是Android5.0.1。
参考资料
本文使用Android NDK的工具进行交叉编译,google官方参考资料:Standalone Toolchain,这篇文章详细介绍了如何使用Android NDK工具进行交叉编译。
4.编译依赖库libiconv
版本:1.14
编译参考资料:编译可在Android上运行的libiconv库
gettext
版本:0.19.7
编译参考资料:编译可在Android上运行的gettext库
pcre
版本:8.38
编译参考资料:编译可在Android上运行的pcre库
libffi
版本:3.2.1
编译参考资料:编译可在Android上运行的libffi库
在glib源码的根目录下创建android.cache文件,然后在该文件中写入下面的内容:
glib_cv_long_long_format=ll glib_cv_stack_grows=no glib_cv_uscore=no ac_cv_func_posix_getpwuid_r=no ac_cv_func_posix_getgrgid_r=no
cache文件的glib官方参考资料:Cross-compiling the GLib package。
6.运行autogen.sh在glib源码根目录下输入命令:
./autogen.sh
该脚本执行成功时,会生成一个名为"configure"的脚本文件。
7.运行configure
CPP="arm-linux-androideabi-gcc -E" CPPFLAGS="-I${SYSROOT}/usr/include" CFLAGS="-fPIC -pic" CXXFLAGS="-fPIC -pic" LDFLAGS="-fPIC -pic" ./configure --prefix="${SYSROOT}/usr" --host=arm-linux-androideabi --cache-file=android.cache CFLAGS="--sysroot $SYSROOT" --enable-static
如果不添加CPP和CPPFLAGS则将会报这个错误:"configure: error: C preprocessor "/lib/cpp" fails sanity check"。
--host选项的值"arm-linux-androideabi"在configure脚本中会被扩展成"arm-linux-androideabi-gcc"这样的编译工具名。
8.编译和安装使用make命令编译源码,当编译成功是使用"make install"命令进行安装,libiconv将会被安装到${SYSROOT}/usr/lib目录下,在上文中"--prefix="${SYSROOT}/usr"命令选项就是用来指定安装的目录的。
排错configure.ac:88: error: possibly undefined macro: AC_DEFINE
问题
configure.ac:88: error: possibly undefined macro: AC_DEFINE
这是一个很模糊的问题我编译glib时安装了automake、libtool工具,却还是提示这个错误。
解决办法
我安装了这些工具解决了这个办法:autoconf,automake,autopoint,pkg-config。
但是具体是安装了什么库解决了这个问题,我还不清楚。
解决办法来源帖子:
1、M Cross Bug 2 glib Build Fail #799:https://github.com/mxe/mxe/issues/799
2、http://mxe.cc/#requirements-debian
作者:寻禹@阿里移动安全,更多技术文章,请访问阿里聚安全博客
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/12757.html
摘要:前言这是系列文章,它们由编译可在上运行的库及其他篇文章组成,这篇文章在编译依赖库一节中列出。编译环境本文在位系统上对项目进行交叉编译。约定下文中的若无特殊说明均指。运行在源码根目录下输入命令该脚本执行成功时,会生成一个名为的脚本文件。 前言 这是系列文章,它们由《编译可在Android上运行的glib库》及其他4篇文章组成,这4篇文章在编译依赖库一节中列出。由于glib库依赖于其他第三...
摘要:前言这是系列文章,它们由编译可在上运行的库及其他篇文章组成,这篇文章在编译依赖库一节中列出。编译环境本文在位系统上对项目进行交叉编译。约定下文中的若无特殊说明均指。运行在源码根目录下输入命令该脚本执行成功时,会生成一个名为的脚本文件。 前言 这是系列文章,它们由《编译可在Android上运行的glib库》及其他4篇文章组成,这4篇文章在编译依赖库一节中列出。由于glib库依赖于其他第三...
摘要:意味着编译出的程序只能在机器上执行。当命令行中有选项时,脚本中的禁用宏将被设置为,这个宏默认为。当宏为时,会对宏进行设置,下面是与有关的设置宏的代码脚本会将宏的内容写入文件。 前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码。下文中的NDK若无特殊说明均指Android NDK。下文中$NDK表示的是NDK的根目录。 ...
摘要:混合使用不同运行时编译的文件文件可以依赖于不同的运行时,静态编译或者动态加载。作为一个经验法则,当只有一个文件时,静态编译运行时是没问题的,否则当存在多个文件时,应该让所有的文件都动态链接相同的运行时。 现在很多第三方SDK都会提供 so, 关于 ndk开发的好处之前的文章也有做了介绍。但是在技术支持的过程中发现大多数的Android 开发其实并不知道怎么正确的集成so文件。一般技术都...
摘要:基本信息作者项目项目里的库正好动态加载系列文章谈到了加载库的地方,我觉得这里可以顺便谈谈使用库时需要注意的一些问题。 基本信息 作者:kaedea 项目:android-dynamical-loading Android项目里的SO库 正好动态加载系列文章谈到了加载SO库的地方,我觉得这里可以顺便谈谈使用SO库时需要注意的一些问题。或许这些问题对于经常和SO库开发打交道的同学来说已...
阅读 3404·2021-09-22 15:15
阅读 2370·2021-09-03 10:29
阅读 3392·2021-08-12 13:24
阅读 1124·2019-08-30 15:53
阅读 1657·2019-08-30 15:43
阅读 1039·2019-08-29 17:04
阅读 2697·2019-08-29 15:08
阅读 1468·2019-08-29 13:13