GCC交叉编译平台建立过程

上传人:鲁** 文档编号:475155443 上传时间:2023-11-30 格式:DOC 页数:11 大小:211KB
返回 下载 相关 举报
GCC交叉编译平台建立过程_第1页
第1页 / 共11页
GCC交叉编译平台建立过程_第2页
第2页 / 共11页
GCC交叉编译平台建立过程_第3页
第3页 / 共11页
GCC交叉编译平台建立过程_第4页
第4页 / 共11页
GCC交叉编译平台建立过程_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《GCC交叉编译平台建立过程》由会员分享,可在线阅读,更多相关《GCC交叉编译平台建立过程(11页珍藏版)》请在金锄头文库上搜索。

1、GCC交叉编译平台建立过程(人工智能与机器人研究所李国辉)基于朕入式系统的开发环境主耍涉及到交叉编译器,汇编器、链接器等。这些工具一般由开发cpu的厂商提供,可以育.接在wmdows下或者在1111UX下运行。本文的目的并不是具体的讲述如何去使用这些工具,而是当得不到这些现成的工具时,自己如何去构造这些工具。构造的方法就是应用gcc的源代码建立针对目标处理器的交义编译平台。GCC(GNUCompilei-Collection)是现阶段被广泛使用的开放源码的编译器,它支持多种高级语言(c,c+,foman,java,ada),同时支持多种处理器(alpha,arm,avr,IA-64,mtel3

2、86,AMD,mips,nmux,powei-pc,sparc,pdp-l1.),艺彳仅因为其支持多目标的特性而被广大厂商使用,更是因为其在生成代码的质量、速度上的优秀表现而获得广泛的赞美。下面具体讲述交义编译平台建立过程。一、准备工作1安装linux操作系统这个平台是在lmux下建立起來的,所用的linux版本为iedhatv9.2。所用的本地编译器为gcc3.2.2(iedhatv9.2H带的gcc)。用这个本地编译器编译gcc的源代码使之产生针对aim处理器的交义编译器。本地编译器是指它编译出來的程序可在本地机(即运行编译器的机器)上运行;而交叉编译器编译出來的程序不可以在本地机上运行。

3、如下图所示:需要说明的是,由于lmux下的一些程序并不具有很好的兼容性和稳定性,因此所用的gcc本地编译器最好是稳定的版本(比如gcc3.2.2),而不耍一味地追求最高的版本。2.为目标机器建立binutils.Binutils是一个工具包,它包含汇编器、链接器以及管理静态库、动态库的一些工具。我们从网上下载的一般是bmutils的源文件,我们需耍把它编译成针对目标机(ami)的工具,这样编译后得到的汇编器是针对ami的汇编器,链接器也是针对址m的链接器。首先从网上下载bmiitils2.1321皿gz,执行以下命令:tar-xzvfbinutils-2.13.2.1.tah.gz新生成的bi

4、nutils-2.13.2.1被称为源目录,用$srcdir表示它。以后在出现$sicdir的地方,应该用真实的路径來替换它。然后建立目标目录,目标目录(用$objdir表示)是用來存放编译结果的地方。GCC建议编译后的文件不耍放在源目录Ssi-cdn(虽然这样做也可以),最好单独存放在另外一个目录中,比如$smdir的同级目录。用cd命令进入目标目录,然后执行以下命令:$srcdir/configureprefix=/usr/localtarget=arm-elfwith-cpu=arm8配置的目的是将binutils安装到什么地方,在这里为/usr/local,在linux系统下,这个目录

5、就是用來存放安装结果的地方。-geth和-with-cpu选项说明了生成的汇编器和链接器等是针对ami处理器的,具体是aim系列的aim8处理器,并且该处理器上还没有运行操作系统(大多数嵌入式系统都是这样的)。该命令执行$srudir目录下的configure文件,同时接受用户输入的选项,然后生成MakefileoMakefile说明了gcc众多源文件的编译顺序和依赖关系。用户在编译gcc源代码时,不需耍依次对各源文件进行编译,只需执行make命令即可,它能解释makefile里的编译顺序和依赖关系,一次性完成全部的编译过程。关于Makefile的更进一步的探讨,有兴趣的同学可以参考附录。配置

6、完成之后然后执行以下两个命令就完成了安装过程:makemakeinstall其中执行makemstall耍求用户具有超级权限。执行以下命令会看到编译生成的工具:Is/usr/local/binarm-elfasarm-elMdaim-elfaiIs/usr/local/arm-elfbilllib我们可以看到/usi/local是bmutils安装用到的最上层目录,在执行configure命令时通过-piefix设置了这个最上层目录。二、构造交叉编译器如果准备工作己经就绪,剩下的就是构造这个新的编译器了。构造编译器所需的步骤基本上与构造bmutils的步骤相同,需要建立目标目录然后在目标目录里

7、执行configure、makeall-gccmakeinstall-gcc命令就完成了编译过程。$srcdir/configureprefix=/usr/localtarget=arm-elfwith-cpu=arm8enable-languages=cdisable-shareddisable-nlswith-gnu-aswith-gnu-ld$srcdir就是解压缩gcc-3.2.3.tar.gz之后生成的目录,比如/gcc3.2.3.在这里也设置了前缀(prefix),需要注意的是,这个前缀必须与配置bmutils时的前缀一样。因为在编译gcc源码的过程中需要用到piefix目录里的一

8、些工具,比女口arm-elfas、ann-elf-ld、arm-elf-ai等等。之后执行Makeall-gccmakeinstall-gcc运行完毕之后,可以在/usr/local/bin里找到构造好的交叉编译程序,如下:Is/usr/local/binarm-elf-gcc需要说明的是:1. 如果用户设置的prefix选项不是/usr/local,而是其他目录,用Sprefix表示,那么在make之前需要执行:PATH=$PATH:$prefix这样设置了PATH变量之后,在编译时,arm-elf-asarm-elf-ld这些工具就能够被找到。2. 在编译时,一定耍是makeall-gcc

9、,而不能是简单的make命令,makemll-gcc只生成交义编译程序,不生成c运行时库,这在很多情况下己经足够To三、后续的工作后续的工作就是生成c运行时库,有这些库的支持,c语言应用程序的开发才会变得功能强大。在这里,只简单的说明库的作用,至于如何生成c运行时库,可参考gcc技术参考大全第17章。在c语言中,一些比较常用的函数,比如math.h里的函数,己经由编译器的厂商写好,并且已经编译成二进制文件(目标文件),用户如果要用这些函数,不需要再去写函数,只需调用即可。这些常用的函数范围相当广泛,涉及到输入输出,文件读写,内存分配等,极大地方便了程序员开发出功能强大的应用程序。这些函数的目标

10、文件的集合就是库。不仅编译器或者操作系统提供这种一般功能的库,也有其他软件开发商提供专门用途的库,这种类型的库称为sdk(softwaredevelopmentkit),比如专门用丁图像处理的T具包VisualSDK视频处理匚具包OPENCV、图形界面开发工具包GTK。另外,微软开发的MFC类库其实也是各种类定义的目标文件集合。使用库进行编程能省去程序员大量的重复劳动,一个高效的程序员应该在开始写程序之前,应确定耍写的模块是否能用现成的库来实现,这样既保证了代码的可靠性乂节省了时间。在GCC中生成库的例子如下:gcc-cinlet.coutlet,cgenspru.car-rlibspin.a

11、inlet.ooutlet.ogenspru.ogccmain,clibspin.a-ospinner注:libspin.a是inlet,ooutlet,ogenspru.o的集合,但在链接时,并不是这三个目标文件都被链接进来,只有main,c中用到的目标文件才会被链接进來。Makefile概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Wmdows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。

12、特别在Unix卜的软件编译,你就不能不自己写makefileT,会不会写makefile,从一个侧面说明了一个人是否具备完成人型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则來指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,共至进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带來的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极人的提高了软件开发的效率oma

13、ke是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,人多数的IDE都有这个命令,比如:Delphi的make,VisualC+的nmake,LunixFGNU的make。nJ见,makefile都成为了一种在工程方面的编译方法。现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHatLmux8.0,make的版本是3.80。必竞,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循J:IEEE1003.

14、2-1992标准的(POSIX.2)o在这篇文档中,将以C/C+的源码作为我们基础,所以必然涉及一些关J-C/C卄的编译的知识,相关这方而的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX卜的GCC和CCo关J:程序的编译和链接在此,我想多说关J:程序编译的一些规范和方法,一般來说,无论是C、C+、还是pas,首先耍把源文件编译成中间代码文件,在Windows卜也就是.obj文件,UNIX卜是.o文件,即ObjectFile,这个动作叫做编译(compile)。然后再把大量:的ObjectFile合成执行文件,这个动作叫作链接(lnik)o编译时,编译器需要的是语法的正确,函

15、数与变堂的声明的正确。对丁后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是虑明,而定义应该放在C/C卄文件中),只耍所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OEJ文件)。链接时,主要是链接函数和全局变最,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(ObjectFile),在人多数时候,由J:源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对编译很不方便,所以,我们要给中间目标文件打个包,在Wmdows卜这种包叫“库文件”(LibraryFile),也就是ib文件,在UNIX卜,是AichiveFile,也就是.a文件。总结一卜,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变最是否被声明。如呆函数未被卢明,编译器会给出一个警告,但可以生成ObjectFileo而在链接程序时,链接器会在所有的ObjectFile中找寻函数的实现,如果找不到,那到就会报链接错误码(LinkerEnor),在VC卜,这种错误一般是:Lmk2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的ObjectFile.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号