一.需要掌握的工具&技能。
1、Linux操作系统终端的使用&基本Linux操作命令。
注解:Linux操作系统的终端类似windows操作系统的DOS命令窗口,它是运行在Linux操作系统中的命令行工具,通过在其命令提示符后面输入相应命令,完成对
操作系统相应功能的实现和调用。Linux操作系统命令繁多,但常用的命令只有有限几个,很容易掌握,具体参见Linux命令相关文档。
2、了解各种ARM交叉工具的特性及其针对的编译对象。
注解:现在网络&各种水平参差不齐的书籍上对建立基于ARM体系结构的交叉编译环境的方法无外乎三种:
1-自己动手编译一个交叉编译环境。
2-用crosstool脚本制作针对Linux2.X内核的交叉编译工具链。
3-使用已经编译好的现成交叉编译工具链。
第1种方法难度最大也最为繁琐;第2种相对简单许多;最后一种最为简单。通过对广泛使用的交叉编译工具链的安装来建立交叉编译环境也是本文
阐述的主要内容。毕竟,学习的过程应该由浅入深,是不变的道理。更重要的是,嵌入式工程师的主要工作是应用现有的可靠工具而非创造他们,如果有
现成的工具方便使用,又何必自寻烦恼。
但是,单纯应用现成的交叉编译工具链也有一个问题:某一版本的工具链一般来说仅对某阶段出现的系统内核适用,随着操作系统内核的不断升级,这些
“古老”的工具链势必失去优势,在新的工具链出现之前,亲自动手编译适用的工具链在所难免,不过,这个问题,以后再说吧!目前规避这一问题的方法
是:使用版本比较老的Linux内核,比如:linux2.4内核,一般来说,这样成熟、稳定的内核对嵌入式应用应该足够使用,重要的是,现在主流的工具链
对它的支持还是相当好的。
网络上可用的已经编译好的交叉编译工具链版本繁多,他们大都针对特定版本的linux内核,即便针对同一版本内核也会出现大量版本的交叉编译工具链。
如此看来,选择一款适合自己开发所用的工具链,是在必然。编译的版本配合不好的话就会出错,所以要选择好编译版本,如果这个版本不行的话,可以
试试其他的版本,这就必然要对目前各种主流版本的交叉编译工具链所针对的编译对象有所了解:
arm-linux-gcc-3.3.2.tar.bz2: 03-Nov-2003 10:23 71M 用来编译 arm + Linux busybox bootloader(u- boot)
arm-linux-gcc-3.4.1.tar.bz2: 29-Jul-2004 14:01 41M 用来编译 arm + Linux 2.6的内核
arm-linux-gcc-3.4.4.tar.bz2: 用来编译 arm + Linux
下载地址:
http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.3.2.tar.bz2
cross-2.95.3.tar.bz2: 20-Jul-2001 21:12 35M 用来编译 arm + Linux
cross-3.0.tar.bz2: 20-Jul-2001 22:27 39M 用来编译 arm + Linux
cross-3.2.tar.bz2: 23-Aug-2002 11:04 81M 用来编译 arm + Linux
cross-3.2.tar.gz: 23-Aug-2002 10:01 93M 用来编译 arm + Linux
下载地址:
http://ftp.arm.linux.org.uk/pub/armlinux/toolchain
arm-elf-tools-20030314.sh: 用来编译 arm + uCLinux
arm-elf-tools-20040427.sh: 用来编译 arm + uCLinux
这里需要说明的是:嵌入式Linux内核的种类和版本有很多,设计者可以选择商业嵌入式Linux内核或者是使用开源的标准Linux内核自己开发。
我们常见的内核有:
Linux 2.4 :由标准Linux 2.4内核裁剪、配置得到。 (标准Linux内核)
Linux 2.6 :由标准Linux 2.6内核裁剪、配置得到。 (标准Linux内核)
uCLinux :专为嵌入式Linux设计的操作系统,不支持MMU,适合应用于没有MMU的处理器上,比如:ARM7。(商业嵌入式Linux内核)
RTLinux :专为嵌入式Linux设计的操作系统,支持MMU,适合应用于有MMU的处理器上,比如:ARM9。 (商业嵌入式Linux内核)
.
.
.
既然适合应用在嵌入式领域的内核版本如此繁多,那么支持他们的工具链就分别有着不可替代的专用性。例如:
arm-linux-gcc-3.4.1.tar.bz2 工具链编译出可以运行在有MMU的ARM处理器上的Linux 2.4 或 Linux 2.6内核。
arm-elf-tools-20040427.sh 工具链编译出可以运行在没有MMU的ARM处理器上的uClinux内核。
3、掌握基本的vi编辑器命令和相关使用方法。
注解:vi编辑器的使用详见相关文档。
4、知道什么是交叉编译。
注解:详见相关文档。
二.开始建立。
1、下载ARM交叉工具链:
我们这里使用的是arm-linux-gcc-3.4.1工具链,并以其为例讲述安装过程。下载网址如下:
http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
下载后,文件arm-linux-gcc-3.4.1.tar.bz2即默认存在: /home/XXXXXX(你默认的文件目录)/下载目录中。
注解:/home/XXXXXX(你默认的文件目录)/下载 ,是安装Linux后,默认的下载路径。
2、复制arm-linux-gcc-3.4.1.tar.bz2文件到根(/)目录下:
打开Linux终端。
键入su命令:[Potheads@ACIDHEAD ~]$ su,回车,输入ROOT用户密码,回车,现在你的身份是超级用户ROOT!
键入cd命令:[root@ACIDHEAD Potheads]# cd (./)下载,回车。
键入cp命令:[root@ACIDHEAD 下载]# cp arm-linux-gcc-3.4.1.tar.bz2 /,回车,现在你的arm-linux-gcc-3.4.1.tar.bz2文件就在你的/目录下了。
注解:在linux操作系统下对文件进行编辑、处理、操作,一个首要的前提是:要“置身”在被操作文件的目录内!试想一下在windows中使用鼠标对文件进行操作的
过程:首先你要进入此文件所在的文件夹(目录)中,然后才是copy、delete、edit…………………………。在Linux中也是一样,只不过把鼠标换成了一堆堆的繁琐
命令,如此而已。
普通用户和超级用户(root)是经常被提起的概念,一般的应用只和普通用户有关,但,一些特殊权限的操作就要提到超级用户这个概念了。顾名思义吧,超级
用户就是一个有特殊权限的用户,以超级用户身份登录后,你就有机会做下面提到的事情了。
根目录和其他目录,有关他们的关系的文档网络上有的是,这里不会讨论这个问题,要讨论的是:怎么对根目录进行操作和为什么要对根目录操作。
arm-linux-gcc-3.4.1.tar.bz2解压后会自动建立/usr/local/arm/3.4.1/……………………目录,如果在/home下解压(前提是要先把arm-linux-gcc-3.4.1.tar.bz2
copy到/home下),就会自动生成以下目录:/home/usr/local/arm/3.4.1/……………………;如果在/下解压,arm目录就会存在于/usr/local/arm………………目录
下。要注意,两次出现的usr目录的含义是不一样的,在/home下的usr是解压时自动生成的,在/下的usr是Linux文件系统自己的,看出在不同目录下解压的区别
了吧!如果我们想要在/目录下解压,以普通用户登录的我们,是没有权限吧arm-linux-gcc-3.4.1.tar.bz2拷贝到/目录下的,所以,我们一定要先以超级
用户的身份登录系统,以获得更大的权限!
3、Come on!到根目录下去:
键入cd命令:[root@ACIDHEAD 下载]# cd /,回车。Woudful!你已经在/目录下了!
注解:我们的arm-linux-gcc-3.4.1.tar.bz2已经在/目录中,我们要对它做解压操作,就一定要“置身”在它所在的目录下。不再赘述。
4、解压&安装arm-linux-gcc-3.4.1.tar.bz2:
这是比较关键的一步!
键入tar命令:[root@ACIDHEAD /]# tar -xvjf arm-linux-gcc-3.4.1.tar.bz2,回车。
等待---一大堆解压的过程。
直到命令提示符[root@ACIDHEAD /]# 再次出现。
注解:我们下载的arm-linux-gcc-3.4.1.tar.bz2是已经编译好的,实际上就是一个目录(directory),如果我们是用源码自己编译,编译成功就会在/usr/local下
生成一个 arm 目录,我们下载的arm-linux-gcc-3.4.1.tar.bz2就是将生成的这个 /usr/local/arm 打包成的。我们只要解开就行了,解压到哪儿无关紧要,
在这里我们把它copy到/目录下解压。由此看来,我们只要正确将其解压就可获得稳定的工具链,如此看来,这样建立交叉编译环境,确实很简单。
5、让Linux知道arm-Linux-gcc编译器的存在:
这里使Linux知道arm-linux-gcc工具链存在即指改变配置文件profile中的环境变量的值。
键入vi命令:[root@ACIDHEAD /]# vi /etc/profile ,回车。
在profile文件的最后一行添加 export PATH=$PATH:/usr/local/arm/3.4.1/bin
注解:关于配置文件和环境变量参考相关文档。
安装arm-linux-gcc工具链后,要使用工具链编译程序,需要调用工具链,也就是让Linux知道arm-linux-gcc的存在。
有如下三种方法:
1).用export命令:[root@ACIDHEAD /]# export PATH=$PATH:/usr/local/arm/3.4.1/bin (临时起作用)
2).在你的/home目录里,修改自己的环境变量:[root@ACIDHEAD /]# vi ~/.bash_profile 把这个文件添加到 .bash_profile中就行了;(对当前用户起作用)
3).修改/etc/porfile文件,在最后加上export PATH=$PATH:/usr/local/arm/3.4.1/bin(对所有用户起作用,也是本文使用的方法);
第1种方法看似麻烦,每次都需要输入命令,但在实际应用中,如果安装了多个工具链,可以使用这种方法在多个工具链之间随时切换。
这里要注意:如果在/home下解压,只要将 PATH=$PATH:/usr/local/arm/3.4.1/bin 改成 PATH=$PATH:/home/usr/local/arm/3.4.1/bin就可以了。
6、让arm-linux-gcc工具链生效:
方法一:重启电脑。
方法二:键入source命令:[root@ACIDHEAD /]# source /etc/profile ,回车。上述设置会马上生效,不再需要重启。
7、安装成功。
三.检查配置文件中环境变量值修改结果。
1、键入export命令:[root@ACIDHEAD /]# export ,回车。显示配置文件的所有环境变量。
2、可一看到:
declare -x PATH="/usr/kerberos/sbin:/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/arm/3.4.1/bin:
/home/Potheads/公共的/rar:/home/Potheads/bin"
中多了:/usr/local/arm/3.4.1/bin一段。
说明配置文件修改成功。
四、测试交叉编译工具。
1、首先,键入vi命令:
在编辑器vi中写如下一段简单的c程序:[Potheads@ACIDHEAD ~]$ vi exp.c,回车。
会在相同目录下得到exp.c文件。
进入vi编辑器的编辑页面:
#include <stdio.h> // for printf() function
main()
{
printf("John Lennon is a real hero!/n");
}
2、从vi编辑器退出,重新进入终端的命令行模式。
3、使用gcc编译exp.c并在pc机(Linux操作系统)上运行:
键入gcc命令: [Potheads@ACIDHEAD ~]$ gcc exp.c -o exp ,回车。
会在相同目录下得到exp可执行文件。
键入执行命令: [Potheads@ACIDHEAD ~]$ ./exp ,回车。
在终端中会显示出:John Lennon is a real hero!
编译成功!
4、使用arm-linux-gcc编译exp.c:
键入gcc命令: [Potheads@ACIDHEAD ~]$ arm-linux-gcc exp.c -o exp_arm ,回车。
会在相同目录下得到exp_arm可执行文件。 说明交叉工具链安装成功,但要注意,此时的exp_arm
并不是可以在装有Linux操作系统的PC机上运行的文件,它只能运行于ARM芯片上!
注解:当然,在编译文件前,一定要用cd命令先到被编译到文件所在到文件夹(目录)下。
上面arm-linux-gcc是第一次出现,有人可能会问这个哪里来的,不妨打开刚才安装的交叉编译工具目录/usr /local/arm/3.4.1/bin/可以发现里面有一个
arm-linux-gcc文件,这个就是针对arm的CPU的gcc编译器了。以后用其它编译工具链式也可以通过这种方法看看其编译器是什么。
5、验证编译结果:
键入file命令:[Potheads@ACIDHEAD ~]$ file exp_arm,回车。
出现以下结果:exp: ELF 32-bit LSB executable, ARM, version 1,
dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped
说明一切正确。
五.结束。
转载请注明出处。shenyi1919@yahoo.com.cn 2009.02.28
建立基于ARM体系结构的交叉编译环境
最新推荐文章于 2024-07-10 13:45:43 发布