简单地说,就是程序的编译的环境和它的运行的环境不一样。即在一个平台上生成另一个平台上的可执行代码。交叉编译的概念主要和嵌入式开发有关。
主要是由于目标环境中各种资源都相对有限,所以很难直接进行本地编译。
交叉工具链是指可以生成目标环境可运行代码的工具集。我们知道,在Linux系统中的编译工具链包括以下一些工具, 编译器gcc, 链接器ld, 归档工具ar等等,如果在 Linux 环境中交叉编译 Android 系统环境可运行的代码,是不能直接使用Linux下的编译工具的,而应该使用 Android NDK 里的工具链,它们对应的名子为 arm-linux-android-gcc, arm-linux-android-ld等等。
arch-[vendor]-kernel-system-toolname。它由五部分组成,下面分别解释一下每部分的含义:
所以我们可以看到 android 的编译工具的名子会写成 arm-linux-andirod-gcc。
在做交叉编译时,我们常会在脚本中定义一些环境变量以方便我们命名用,常用的环境变量如下:
** —arch 指定架构 ** ** —cross-prefix 交叉编译工具链前辍 ** ** —sys root 交叉编译树的根 **
export ANDROID_NDK=/Users/lichao/Downloads/android-ndk-r10e
./configure
--target-os=linux
--arch=arm --enable-cross-compile
--cross-prefix=/Users/lichao/Downloads/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-
--sysroot=/Users/lichao/Downloads/android-ndk-r10e/platforms/android-9/arch-arm/ #这个很重要,没有的话就无法进行编译。
执行后的结果如下:
install prefix /usr/local
source path .
C compiler arm-linux-androideabi-gcc
C library bionic
host C compiler gcc
host C library
ARCH arm (armv5te)