天天看点

编译可在Android上运行的依赖库(一):glib库

<b>编译可在android上运行的依赖库(一):glib库</b>

<b></b>

<b>作者:寻禹@阿里聚安全</b>

这是系列文章,它们由《编译可在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"。

下载并安装android ndk的过程在这里不做介绍。

下载gitlib

    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文件。

在"$ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin"目录中包含了arm-linux-androideabi-gcc、arm-linux-androideabi-g++等交叉编译工具,不过交叉编译工具的路径根据ndk版本和编译工具版本的不同会有所变化。

sysroot表示一个目录,该目录中包含了目标的系统头文件和库,在当前上下文语境中目标表示的是arm cpu架构。路径中的"android-21"表示android api级别,其中21表示的是android5.0.1。

libiconv

版本:1.14

gettext

版本:0.19.7

pcre

版本:8.38

libffi

版本:3.2.1

在glib源码的根目录下创建android.cache文件,然后在该文件中写入下面的内容:

在glib源码根目录下输入命令:

该脚本执行成功时,会生成一个名为"configure"的脚本文件。

如果不添加cpp和cppflags则将会报这个错误:"configure: error: c preprocessor "/lib/cpp" fails sanity check"。

--host选项的值"arm-linux-androideabi"在configure脚本中会被扩展成"arm-linux-androideabi-gcc"这样的编译工具名。

使用make命令编译源码,当编译成功是使用"make install"命令进行安装,libiconv将会被安装到${sysroot}/usr/lib目录下,在上文中"--prefix="${sysroot}/usr"命令选项就是用来指定安装的目录的。

排错

问题

这是一个很模糊的问题我编译glib时安装了automake、libtool工具,却还是提示这个错误。

解决办法

我安装了这些工具解决了这个办法:autoconf,automake,autopoint,pkg-config。

但是具体是安装了什么库解决了这个问题,我还不清楚。

解决办法来源帖子:

阿里聚安全由阿里巴巴移动安全部出品,面向企业和开发者提供企业安全解决方案,全面覆盖移动安全、数据风控、内容安全、实人认证等维度,并在业界率先提出“以业务为中心的安全”,赋能生态,与行业共享阿里巴巴集团多年沉淀的专业安全能力。

继续阅读