1、我们一般开发机上已经有一套开发工具,我们称之为原生开发套件,我们一般就是用它们来写程序,那么,那什么又是交叉编译环境呢?其实一点也不神秘,也就是在开发机上再安装一套开发工具,这套开发工具编译出来的程序,如内核、系统工作或者我们自己的程序,是放在目标主机上运行的。那么或许有初学者会问,直接用原生开发工具为目标主机编译程序不就完了?至少我当初是这么想的。一般来说,我们的开发机都是X86 平台,原生开发套件开发的工具,也针对X86 平台,而我们的目标主机可能是PowerPC、IXP、MIPS所以,我们的交叉编译环境是针对某一类具体平台的。一般来讲,交叉开发环境需要二进制工具程序、编译器、C链接库,嵌
2、入式开发常用的这三类软件是:BinutilsGccuClibc当然,GNU包含的工具套件不仅于此,你还要以根据实际需要,进行选择第二步、编译内核开发工具是针对某一类硬件平台,内核同样也是。这一步,我们需要用第一步中建立的工具,对内核进行编译,对于有内核编译经验的人来说,这是非常简单的;第三步、建立根文件系统也就是建立我们平常看到的bin、dev、proc这一大堆目录,以及一些必备的文件;另外,我们还需要为我们的目标系统安装一些常用的工具软件,如ls、ifconfig当然,一个办法是找到这些工具的源代码,用第一步建立的交叉编译工具来编译,但是这些软件一是数量多,二是某些体积较大,不适合嵌入式系统
3、,这一步,我们一般都是用busybox来完成的,包括系统引导软件init;最后,我们为系统还需要建立初始化的引导文件,如inittab第四步、启动系统在这一步,我们把建立好的目标、文件、程序、内核及模块全部拷贝到目标机存储器上,如硬盘。然后为系统安装bootloader,对于嵌入式系统,有许多引导程序可供我们使用。不过它们许多都有硬件平台的限制。当然,如果你是工作在X86,可以直接用lilo来引导,事实上,本文就是采用的lilo。做到这一步,将目标存储设备挂上目标机,如果顺利,就可以启动系统了。当然,针对某些特别的平台,不能像硬盘这样拷贝了,需要读卡器、烧录但是基本的方法是相通的!第五步、优化
4、和个性化系统通过前四步,我们已经得到了一个可以正常工作的系统。在这一步里,就是发挥你想像的时候了本文的工作环境项目根目录/home/kendo/project -我将它指定至PATH:$PRJROOT子目录及说明目录内容bootloader 目标板的引导加载程序,如lilo等build-tools 建立交叉编译平台的工具源码debug 调试工具及所有相关包doc 项目中用到的所有文档images 编译好的内核映像,以及根文件系统kernel 各个版本的Linux 内核源码rootfs 制作好的根文件系统sysapps 目标板将要用到的系统应用系统,比如thttpd,udhcpd 等tmp 存放
5、临时文件tools 编译好的跨平台开发工具链以及C链接库工作的脚本#!/usr/binexport PROJECT=skynetexport PRJROOT=/home/$PROJECTexport TARGET=i386-linuxexport PREFIX=$PRJROOT/toolsexport TARGET_PREFIX=$PREFIX/$TARGETexport PATH=$PREFIX/bin:/bin:/sbin:/usr/bin:/usr/sbincd $PRJROOT第二章建立交叉编译环境在 CU中发表的另一篇同名的贴子里,我讲述了一个全手工创建交叉编译环境的方法。目前,创建
6、交叉编译环境,包括建立根文件,一般来讲,有两种方法:手功创建可以得到最大程序的个性化定制,缺点是过程繁杂,特别是极易出错,注意这个“极”字,包括有经验的开发人员;自动创建无它,方便而。因为前一篇文章中,已经讲述了全手工创建交叉编译环境的一般性方法,本文就不打算再重复这个步骤了,感兴趣的朋友,可以再去搜索那篇贴子,提醒一点的就是,在准备工具链的时候,要注意各个工具版本之间的搭配、每个工具需要哪些补丁,我建议你在google上针对这两项搜索一下,准备一个清单,否则本章要讲述的是自动创建交叉编译环境的方法。目标,针对商业硬件平台,厂家都会为你提供一个开发包,我用过XX 厂家的IXP425 和MIPS
7、 的,非常地方便,记得我第一次接触嵌入式开发,拿着这个开发包自动化创建交叉编译环境、编译内核、建立根文件系统、创建Ram Disk,我反复做了三四次,结果还不知道自己究竟做了些什么,呵呵,够傻吧所以,建议没有这方面经验的读者,还是首先尝试一下手工创建的方法吧,而本章接下来的内容,是送给曾经被它深深伤害而不想再次去亲历这项工作而又想提高交率而又在通用平台上工作没有商业开发包的朋友。建立交叉开发工具链准备工具:buildroot-0.9.27.tar.tar只需要一个软件?对,其它的不用准备了,buildroot 事实上是一个脚本与补丁的集合,其它需要用到的软件,如gcc、uClibc,你只需在b
8、uildroot 中指明相应的版本,它会自动去给你下载。事实上,buildroot 到网上去下载所需的所有工作是需要时间的,除非你的带宽足够,否则下载软件时间或许会占去80%,而我在做这项工作之间,所需的工作链全部都在我本地硬盘上,我解压开buildroot后,新建dl 文件夹,将所有工具源码的压缩包拷贝进去,呵呵,buildroot 就不用去网上下载了。我的软件清单:Linux-libc-headers-2.4.27.tar.bz2Gcc-3.3.4.tar.bz2binutils 2.15.91.0.2.tar.bz2uClibc 0.9.27.tar.bz2genext2fs_1.3.o
9、rig.tar.gzccache-2.3.tar.gz将它拷贝到$PRJROOT/build-tools下,解压rootskynet build-tools# tar jxvf buildroot-0.9.27.tar.tarrootskynet build-tools#cd buildroot配置它:rootskynet build-tools#make menuconfigTarget Architecture (i386) - 选择硬件平台,我的是i386Build options - 编译选项这个选项下重要的是($PRJROOT/tools) Toolchain and header
10、file location?编译好的工具链放在哪儿?如果你像我一样,所有工具包都在本地,不需它到网上自动下载,可以把wget command选项清空;Toolchain Options - 工具链选项- Kernel Header Options 头文件它会自动去下载,不过应该保证与你将要用的内核是同一个版本; Use the daily snapshot of uClibc? 使用最近的uClibc的snapshotBinutils Version (binutils 2.15.91.0.2) - Binutils的版本GCC compiler Version (gcc 3.4.2) - g
11、cc 版本* Build/install c+ compiler and libstdc+? Build/install java compiler and libgcj? 支持的语言,我没有选择java Enable ccache support? 启用ccache的支持,它用于编译时头文件的缓存处理,用它来编译程序,第一次会有点慢,但是以后的速度可就很理想了,呵呵- Gdb Options 根据你的需要,选择gdb 的支持Package Selection for the target -这一项我没有选择任意一项,因为我打算根文件系统及busybox 等工具链创建成工,手工来做。Targe
12、t Options - 文件系统类型,根据实际需要选,我用的ext2;配置完成后,编译它:rootskynet build-tools#make这一项工作是非常花时间的,我的工具包全部在本地,也花去我一小时十三分的时间,如果全要下载,我估计网速正常也要多花一两个钟头。经过漫长的等待(事实上并不漫长,去打了几把游戏,很快过去了):make1: Leaving directory /home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3touch -c /home/skynet/build-tools/buildroot/build_i
13、386/genext2fs-1.3/genext2fs#-find /home/skynet/build-tools/buildroot/build_i386/root/lib -type f -name *.so* | xargs/home/skynet/tools/bin/i386-linux-uclibc-strip -remove-section=.comment-remove-section=.note -strip-unneeded 2/dev/null | true;/home/skynet/build-tools/buildroot/build_i386/genext2fs-1
14、.3/genext2fs -i 503 -b 1056 -d /home/skynet/build-tools/buildroot/build_i386/root -q -Dtarget/default/device_table.txt /home/skynet/build-tools/buildroot/root_fs_i386.ext2大功告成!清点战利品让我来看看它究竟做了哪些事情吧:rootskynet skynet# cd toolsrootskynet tools# lsbin bin-ccache i386-linux i386-linux-uclibc include info lib libexec man usrbin:所有的编译工具,如gcc,都在这儿了,只是加了些指定的前缀;bin-ccache:如果在Toolcha
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1