Linux嵌入式系统开发从小白到大牛
上QQ阅读APP看书,第一时间看更新

5.4 什么是交叉编译

对于IDE环境下编程的读者,回忆一下在Visual Studio环境下在终端输出一个hello world的过程,这个过程只需要编写以下的程序代码即可。暂且定义这个文件是hello.c。

编辑完成代码以后,直接单击运行按钮,如果没有语法错误,就能够在终端上输出一个hello world的字样。但是读者有没有想过,为什么输入C语言代码最后能够被计算机所识别并且执行呢?这是因为Visual Studio环境集成了GCC的编译器,这个GCC的编译器帮我们把hello.c文件编译成计算机能够识别的机器码。那么,如果想在嵌入式开发板上输出同样的hello world字样到虚拟终端上,通常的做法有哪几种呢?第一种就是像单片机裸机开发嵌入式系统一样使用集成开发环境,比如keil、IAR、CCS等。第二种是自己搭建嵌入式系统的交叉编译开发环境。

无论是使用哪一种做法,它们都有相同点,就是在计算机上编译生成的文件要下载到开发板的处理器上,然后再上电使其运行。这里需要跨越硬件的平台,原来在x86平台下编译的机器码要转移到开发板的处理器平台下(ARM平台),就需要使用交叉编译。

Keil、IAR这种运行在Widows操作系统上的IDE软件,方便程序员操作,不需要手动搭建开发环境,也不需要自己写Makefile文件,通常像keil一样只需要单击编译运行按钮就可以完成机器码的编译。集成开发环境帮我们做了很多编译过程的工作,比如使用交叉编译器编译文件过程,源文件和头文件的文件关联过程,代码语法语义检查的功能等。但是如果没有了集成开发环境,比如在Linux虚拟机上编写开发板的程序,就要自己下载安装交叉编译工具链,编写Makefile文件等,因此在不同操作系统平台的交叉编译过程称为跨软件平台的交叉编译。

交叉编译就是将目标主机的程序代码在宿主计算机中编辑、编译,然后通过下载或者复制的方式植入到目标主机中,如图5-22所示。

图5-22 交叉编译模型

小白成长之路:为什么要交叉编译

大家肯定会想既然交叉编译这么复杂,为什么还要使用交叉编译呢?为什么不能像winform程序那样,直接在运行Windows操作系统的x86平台下编程并且生成可执行文件呢?通过图5-23的交叉编译模型不难发现,我们的目标主机初始状态是没有任何程序的一块电路板。如果想让目标主机按照需求工作,就需要在宿主计算机上编写编译目标主机的程序代码,这就是使用交叉编译的原因。当然还有其他的原因,由于目标主机的微处理器的性能要远远低于宿主计算机,如指令执行速度、内存空间以及配套的应用程序等,直接在目标主机上编写代码非常不现实。