1、编译

在我们进行开发时,使用高级语言编写的代码通常叫作源代码,比如C编写的后缀名为 .c 的文件。机器是不能直接执行源代码的,必须转换成二进制的机器代码(指令+数据)机器才能读懂并执行。将源代码转换成机器代码的过程称为编译(compile),而编译的工作需要编译器(comcompiler)来完成。

编译器需要检查源代码的语法,没有错误才能被编译通过,源代码经过编译后 ,并没有生成最终的可执行文件,而是生成一种被称为目标文件的中间文件,比如gcc的目标文件的后缀名为.o 。

源代码可能包含多个源文件,比如main.c/fun1.c/fun2.c等等,编译器会对源文件逐个进行编译。因此,有几个源文件,就会对应生成几个目标文件;目标文件并不能被执行,因为它可能存在一些问题,比如源文件之间的引用关系导致的问题。比如文件A.c引用了文件B.c中的变量,A.c和B.c分别编译生成A.o和B.o,A.o中并没有变量的定义,必须依靠B.o才能形成完整的代码。同样的情况表现在源代码对库函数的引用。

把经过编译后生成的目标文件,按照其内在引用关系彼此相连接而生成一个完整的、可执行的文件的过程称为链接。链接工作由链接器完成。

因此,源文件生成可执行文件要经过编译和链接两个步骤才能完成。为了方便,我们也把这个过程统称为编译。

2、本地编译

 是指编译源代码的平台和执行源代码编译后程序的平台是同一个平台。这里的平台指的是:体系结构+操作系统,同一个体系结构可以运行不同的操作系统,同样,同一个操作系统可以在不同的体系结构上运行。比如在inter x86体系结构上运行Linux x86 系统和Windows x86系统。所以本地编译就是在同样的体系结构和操作系统下编译生成可执行文件,在同样的体系结构和操作系统下执行。

3、交叉编译

是指编译源代码的平台和执行源代码编译后程序的平台是两个不同的平台。

比如

我们再windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行

我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out, 是在树莓派上面运行,不是在ubuntu linux上面运行
 

为什么要交叉编译?

  • 目的平台不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器
  • 目的平台资源匮乏,无法运行我们所需要编译器
  • 目的平台还没有建立,连操作系统都没有,更别说运行编译器
  • 有能力进行源代码编译的平台CPU架构或操作系统与目标平台不同

交叉编译例子:在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码

平台运行至少需要两样东西BootLoader(启动引导代码)和操作系统核心

宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。

prefix:交叉编译器的安装位置。

交叉编译需要的工具:交叉编译器、交叉编译工具链