而所谓的交叉编译器,其实也很简单,就是在一种平台上编译出来的程序,不在是放在自己的机器上去运行,而是放到另外一个平台上去运行,也就是我们所说的环境不一样,而这也就是为什么称之为交叉编译器的原因,用英文解释,这就是所谓的cross。
二:体系结构与操作系统
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,是最常见的交叉工具链.什么是EABIEABI,Embeded application binary interface,即嵌入式应用二进制接口,是描述可连接目标代码、库目标代码、可执行文件影像、如何连接、执行和调试以及目标代码生成过程,和c, c++语言接口的规范,是编译连接工具的基础规范,也是研究它们工作原理的基础.简而言之,EABI就是一种编译规范,交叉编译器在编译时,对于浮点运算会使用硬浮点运算,提高了浮点运算的性能,节省了编译时间.
四:交叉编译工具链实例1、arm-none-eabi-gcc(ARMarchitecture,no vendor,nottarget 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(ARMarchitecture, no vendor, creates binaries that run on the Linux operatingsystem, 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-gccAndroid ARM 编译器
4、armccARM 公司推出的编译工具,功能和 arm-none-eabi 类似,可以编译裸机程序(u-boot、kernel),但是不能编译 Linux 应用程序。armcc一般和ARM开发工具一起,KeilMDK、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 xvfarm-cortex_a8-linux-gnueabi.tar.bz23,进入配置文件修改环境变量; sudo vi /etc/bash.bashrc进入之后在最后一行添加如下代码: exportPATH=$PATH:/home/fs/arm-cortex_a8/bin注:fs为名叫fs的用户4,配置生效: source /etc/bash.bashrc5,测试:在命令行输入: arm-c{TAB}(按TAB可以补全,说明交叉编译器安装成功)