交叉编译器解析

作者:华清远见讲师

编译器:

就是将"一种语言(通常为高级语言)"翻译为"另一种语言(通常为低级语言)"的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables) 。

一:什么叫交叉编译器呢?

在解释什么叫交叉编译器前,我们必须要知道“本地编译”这个概念,在我们之前学习过得软件开发中,都属于本地编译,换而言之就是在x86平台下,直接将源文件编译出来的程序,编译出来的程序可以在当前平台下进行运行。在理解这个概念的前提下,我们接下来再来学习什么叫交叉编译器。

而所谓的交叉编译器,其实也很简单,就是在一种平台上编译出来的程序,不在是放在自己的机器上去运行,而是放到另外一个平台上去运行,也就是我们所说的环境不一样,而这也就是为什么称之为交叉编译器的原因,用英文解释,这就是所谓的cross。

二:体系结构与操作系统

1,常见的体系结构有ARM结构、x86结构等.

2,常见的操作系统有linux,windows等.

3,同一个体系结构可以运行不同操作系统,如x86上可以运行Linux、Windows等,在ARM上可以运行Linux、WinCE.

4,同一个操作系统可以在不同的体系结构上运行,比如Linux可以运行在x86上,也可以运行在ARM上.

5.同样的程序不可能运行在多个平台上,比如Windows下应用程序不能在Linux下运行.如果一个应用程序想在另一个平台上运行,必须使用针对该平台的编译器,来重新编译该应用程序的二进制代码,就像我们现在在身边进程遇到的,如果你使用的是苹果手机,下载需要的app,会提醒你下载适合苹果版本的,而如果你使用的是,那你就要选择androin的应用程序。

三:使用交叉编译器的原因

ARM上可以运行操作系统,所以用户完全可以将ARM当做计算机来使用,理论上也可以在ARM上使用本地的编译器来编译程序.但是,编译器在编译程序时,会产生大量的中间文件,这会占用很大的内存和磁盘空间,且对CPU处理速度要求较高,比如S3C2440A内存、磁盘空间只有几十到100多兆,CPU只有400-500MHz,完全达不到编译程序的要求.所以,在进行ARM-linux嵌入式开发时必须在PC机(x86结构)上编译出能够运行在ARM上的程序,然后再将程序下载到ARM中来运行.这就用到了交叉编译器(当然我们也可以从我们简答的认识下去认识为什么使用交叉编译器,在我们平时开发的过程中,我们最多的使用的还是基于x86的平台,确切的可以说就是我们的pc机,因为pc机相对我们的开发板而言,资源是相对丰富的,我们可操作性较强)。

如果要进行交叉编译,用户需要在主机平台上安装对应的交叉编译工具链,然后才能使用去编译源代码,最终生成可在目标平台上运行的代码.交叉编译工具链可以从网上下载,也可以自己制作.但编译器不是万能的,受版本限制,编译某些程序时会报错.常见的交叉编译工具链有:

1,Cross -2.95.3 tar: 该版本较早,除了编译vivi外一般不使用.

2,arm920t-eabi.tgz: 4.1.2版本的编译器,支持eabi,可以编译TX2440A开发板上的所有程序.

3,arm-linux-gcc: 4.3.2版本的编译器,支持eabi,是最常见的交叉工具链.

什么是EABI

EABI,Embeded application binary interface,即嵌入式应用二进制接口,是描述可连接目标代码、库目标代码、可执行文件影像、如何连接、执行和调试以及目标代码生成过程,和c, c++语言接口的规范,是编译连接工具的基础规范,也是研究它们工作原理的基础.简而言之,EABI就是一种编译规范,交叉编译器在编译时,对于浮点运算会使用硬浮点运算,提高了浮点运算的性能,节省了编译时间.

四:交叉编译工具链实例

1、arm-none-eabi-gcc

(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)

用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application),一般适合 ARM7、Cortex-M 和 Cortex-R 内核的芯片使用,所以不支持那些跟操作系统关系密切的函数,比如fork(2),他使用的是 newlib 这个专用于嵌入式系统的C库。

2、arm-none-linux-gnueabi-gcc

(ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)

主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的 u-boot、Linux内核、linux应用等。arm-none-linux-gnueabi基于GCC,使用Glibc库,经过 Codesourcery 公司优化过推出的编译器。arm-none-linux-gnueabi-xxx 交叉编译工具的浮点运算非常优秀。一般ARM9、ARM11、Cortex-A 内核,带有 Linux 操作系统的会用到.

3、arm-eabi-gcc

Android ARM 编译器

4、armcc

ARM 公司推出的编译工具,功能和 arm-none-eabi 类似,可以编译裸机程序(u-boot、kernel),但是不能编译 Linux 应用程序。armcc一般和ARM开发工具一起,Keil MDK、ADS、RVDS和DS-5中的编译器都是armcc,所以 armcc 编译器都是收费的.

5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc

arm-none-uclinuxeabi 用于uCLinux,使用Glibc.

arm-none-symbianelf 用于symbian,没用过,不知道C库是什么 .

五:安装交叉工具链实例

1,将arm-cortex_a8-linux-gnueabi.tar.bz2交叉编译器压缩包复制到虚拟机主目录;

2,解压arm-cortex_a8-linux-gnueabi.tar.bz2压缩包;

tar xvf arm-cortex_a8-linux-gnueabi.tar.bz2

3,进入配置文件修改环境变量;

sudo vi /etc/bash.bashrc

进入之后在最后一行添加如下代码:

export PATH=$PATH:/home/fs/arm-cortex_a8/bin

注:fs为名叫fs的用户

4,配置生效:

source /etc/bash.bashrc

5,测试:

在命令行输入:

arm-c{TAB}(按TAB可以补全,说明交叉编译器安装成功)

你可能感兴趣的:(linux嵌入式方向,交叉编译,华清远见,编译器)