这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 交叉编译器解析

共3条 1/1 1 跳转至

交叉编译器解析

高工
2017-11-25 10:44:12     打赏
交叉编译器解析编译器    就是将"一种语言(通常为高级语言)"翻译为"另一种语言(通常为低级语言)"的程序。一个现代编译器的主要工作流程:源代码 (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(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-gcc

   Android ARM 编译器

   4、armcc

   ARM 公司推出的编译工具,功能和 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可以补全,说明交叉编译器安装成功)




专家
2017-11-25 11:41:57     打赏
2楼

沙发


管理员
2017-11-27 09:15:40     打赏
3楼

格式在调整一下更加完美


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]