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

时间:2022-08-27 19:12:42

前言

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

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

2. 安装必要工具

  • 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环境变量

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

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

设置SYSROOT环境变量

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

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库

5. 编写android.cache

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

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

cache文件的glib官方参考资料:Cross-compiling the GLib package

6. 运行autogen.sh

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

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

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

7. 运行configure

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

如果不添加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

问题

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

这是一个很模糊的问题我编译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

编译可在Android上运行系列:

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

编译可在Android上运行的依赖库(二):gettext库

编译可在Android上运行的依赖库(三):libffi库

编译可在Android上运行的依赖库(四):libiconv库

编译可在Android上运行的依赖库(五):pcre库


作者:寻禹@阿里移动安全,更多技术文章,请访问阿里聚安全博客

系列篇|编译可在Android上运行的依赖库(一):glib库的更多相关文章

  1. 编译可在Android上运行的qemu user mode

    前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的”NDK”若无特殊说明均指”Android NDK”. 下文中”$NDK ...

  2. 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)

    编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的“设 ...

  3. 在Android上运行Java和C程序

    在linux上运行java程序,直接用javac编译,再用java启动虚拟机运行就行了.但是在Android上,由于虚拟机和pc端的不同,所以操作方法也是不一样的.下面介绍Android上运行Hell ...

  4. 在 android 上运行 python 的方法

    在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的事情,因为python脚本真是非常高效,另外,有很多非 ...

  5. react native-调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错

    调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错,而在iOS上运行没问题.原因是因为接口是有验证信息的,而调用这个插件时没有传入,在iOS上会自动加 ...

  6. 【Android Studio安装部署系列】六、在模拟器上运行项目

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在模拟器上运行项目的步骤.不过在实际开发中,一般不采用这种方式,因为影响电脑的运行,所以一般使用真机运行项目. 运行项目 创建模拟器 ...

  7. NDK编译可执行文件在Android 中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

    由于使用了NDK编译的可执行文件在应用中调用,在Android 7.0上的运行情况发现,当运行该可执行文件时,报如下错误: error: only position independent execu ...

  8. Spark源码编译并在YARN上运行WordCount实例

    在学习一门新语言时,想必我们都是"Hello World"程序开始,类似地,分布式计算框架的一个典型实例就是WordCount程序,接触过Hadoop的人肯定都知道用MapRedu ...

  9. Unity3D之AssetBundle学习:Android上运行笔记

    路径统一 在Android上加载StreamingAssets文件夹下的AssetBundle文件,首先需要对加载地址进行处理,注意PC.Android和IOS的地址不一致需要针对不同的平台不同的处理 ...

随机推荐

  1. ffmpeg 常用命令

    mp4中的h264编码,而h264有两种封装: 一种是annexb模式,传统模式,有startcode,SPS和PPS是在ES中:另一种是mp4模式,一般mp4.mkv.avi会没有startcode ...

  2. AOP是什么?

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...

  3. html第二天CSS

  4. java 十六进制颜色对照表

    我们在编程中常常用到十六进制颜色码.   下面是颜色码对照表-英文名称-十六进制-RGB:   英文代码      形像颜色       HEX格式         RGB格式 LightPink 浅 ...

  5. python 强制结束线程的坑

    网上流传了两种能强制结束线程的错误姿势 第一种:通过setDaemon来结束线程 http://www.cnblogs.com/jefferybest/archive/2011/10/09/22040 ...

  6. Python 日志模块实例

    python 打印对象的所有属性值: def prn_obj(obj):     print '\n'.join(['%s:%s' % item for item in obj.__dict__.it ...

  7. python爬虫如何爬知乎的话题?

    因为要做观点,观点的屋子类似于知乎的话题,所以得想办法把他给爬下来,搞了半天最终还是妥妥的搞定了,代码是python写的,不懂得麻烦自学哈!懂得直接看代码,绝对可用 #coding:utf-8 fro ...

  8. JS检测浏览器是否最大化

    function isFullScreen (){     if(         window.outerHeight === screen.availHeight     ){         i ...

  9. Day2 Numerical simulation of optical wave propagation之标量衍射理论基本原理(二)

    2.麦克斯韦方程组的简单行波解 讨论通过线性.各向同性.均匀.无色散.无限电荷和电流的电介质材料的光波传输.在这种情况下,介质具有如下属性: (1)推导获得波动方程( 由麦克斯韦方程组导出的.描述电磁 ...

  10. Problems with Ribbon/Feign/Zuul retry

    原文 https://github.com/spring-cloud/spring-cloud-netflix/issues/1577 I'm using Spring Cloud Camden SR ...