Linux/Mac 交叉编译 Android 程序

来源:互联网 发布:大漠驼铃 php 编辑:程序博客网 时间:2024/05/17 03:26

什么是交叉编译呢

简单地说,就是程序的编译的环境和它的运行的环境不一样。即在一个平台上生成另一个平台上的可执行代码。交叉编译的概念主要和嵌入式开发有关。

为何要有交叉编译

主要是由于目标环境中各种资源都相对有限,所以很难直接进行本地编译。

交叉编译工具链

1. 什么是交叉编译工具链

交叉工具链是指可以生成目标环境可运行代码的工具集。我们知道,在Linux系统中的编译工具链包括以下一些工具, 编译器gcc, 链接器ld, 归档工具ar等等,如果在 Linux 环境中交叉编译 Android 系统环境可运行的代码,是不能直接使用Linux下的编译工具的,而应该使用 Android NDK 里的工具链,它们对应的名子为 arm-linux-android-gcc, arm-linux-android-ld等等。

2. 交叉编译工具的命名规则

arch-[vendor]-kernel-system-toolname。它由五部分组成,下面分别解释一下每部分的含义:

  1. arch,指的是CPU架构, 一般包括如下几种架构: arm, mips, powerpc, x86, x86_64。
  2. verdor, 一般指的是生产厂商, 如果没有生产厂商可以为空。
  3. kernel, 指的目标环境使用的 kernel,以android为例,它使用的是 linux内核,所以在这部分会填写为linux。
  4. system, 指的是那个系统, 如androideabi, android
  5. toolname: 指的是 gcc, ld, ar等。

所以我们可以看到 android 的编译工具的名子会写成 arm-linux-andirod-gcc。

3. 交叉编译常用变量说明

在做交叉编译时,我们常会在脚本中定义一些环境变量以方便我们命名用,常用的环境变量如下:

  1. PREFIX: 指明交叉编译后输出的目录。
  2. ARCH: 指明交叉编译后输出的CPU架构。
  3. CROSS-PREFIX:指明交叉编译前辍 arch-vender-kernel-system
  4. SYSROOT: 指明交叉编译目标机器的头文件和库文件目录
  5. TOOLCHAIN: 指明交叉编译工具链的位置。
  6. PLATFROM: 指明交叉编译时使用的是哪个版本的的头文件和库文件。它是 SYSROOT的一部分。
  7. ANDROID_NDK: 指明 Android NDK 所在目录。

如何进行交叉编译


  1. 通过设置configure 参数来生成交叉编译的 Makefile 文件
    —arch 指定架构
    —cross-prefix 交叉编译工具链前辍
    —sys root 交叉编译树的根
  2. 例了
    以ffmpeg的交叉编译为例,我们可以来看一下如果生成交叉编译的Makefile。

./configure –target-os=linux –arch=arm –enable-cross-compile –cross-prefix=arm-linux-androideabi- –sysroot=~Library/Android/sdk/ndk-bundle/platforms/android-9/arch-arm
执行后的结果如下:

install prefix            /usr/localsource path               .C compiler                arm-linux-androideabi-gccC library                 bionichost C compiler           gcchost C library            ARCH                      arm (armv5te)

微信公众号