1. 获取编译器
我们自己可以编译制作一个交叉编译工具链(Cross-compile Toolchain)来用,但为了方便、稳定起见,我们大多数时候会去选择成熟的第三方工具链。codesourcery的交叉工具链是很常见的一种,以ARM为例,我们可以从codesourcery 处下载到最新的版本。
可以看到有4个OS平台版本可供选择,如图1,那么该选择哪一个下载呢?
图1
在codesourcery的一个页面上我们找到了答案:
This table applies to the target system on which your applications will run, not to the host system on which you run Sourcery G++.
Target Platform | Description |
---|---|
EABI/ELF | RTOS systems or bare metalsystems where no operating system is present. These configurations should not be used to build Linux kernels or applications. |
uClinux? | Systems running uClinux, i.e. Linux on CPUs without an MMU. Use Sourcery G++ to build both the uClinux kernel and applications. |
GNU/Linux? | Systems running fullLinux, i.e., Linux on CPUs with an MMU. Use Sourcery G++ to build both the Linux kernel and applications. |
Microsoft Windows? | Systems running Microsoft Windows 2000, or later. |
也就是说,如果打算用来编译linux kernel或者基于linux的应用程序,则应该选择GNU/Linux;EABI/ELF适用于没有操作系统(或者RTOS)的裸机;uClinux适用于没有MMU的Linux。
其中 IA32 GNU/Linux TAR 是制作好的编译器,Source TAR是源码,我们下载制作好的编译器,同时还得下载datasheet和用户手册(started Guide(pdf))。注:datasheet 是介绍Gcc和Glibc的版本号,用户手册是介绍怎么使用。
我们下载 IA32 GNU/Linux TAR :这是制作好的交叉编译器,比如:
arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
2.配置编译器
1)解压刚下载的压缩文件
$ tar jvxf arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
则产生一个arm-2010.09目录,进入目录。
编译器二进制文件全在/bin目录下面。
2)编译器参数设置
该编译器支持三种版本的cpu,分别是armv4t、armv5t和armv7t。默认支持的是armv5t的cpu。由于本人的开发板是 tq2440.属于armv4t的cpu。所以在编译的时候需要设置相应的参数。对应的命令是:arm-none-linux-gnueabi-gcc -march=armv4t $* filename
为了方便采用tq手册中的方法。在/bin目录下面建立若干个可执行脚本,分别命名为:arm-linux-xxx(xxx代表的就是同目录下的arm-none-linux-gnueabi-xxx中的xxx) 然后在脚本文件中添加如下内容:
#!/bin/sh
exec arm-none-linux-gnueabi-xxx -march=armv4t $*
注意:实际上只要对gcc gcc-4.5.1 和g++这三个制作可执行脚本就可以了。而针对其他的使用命令:ln -s arm-none-linux-gnueabi-xxx arm-linux-xxx 做成链接指向对应的编译器就可以了。
这是新建的arm-linux-gcc脚本
$ cat arm-linux-gcc
#!/bin/sh
exec arm-none-linux-gnueabi-gcc -march=armv4t $*
然后我们需要弄明白两件事情:
* 我们所需要的交叉编译器的库(lib)的路径是:arm-none-linux-gnueabi/libc/armv4t/lib/目录下的,我们制作的文件系统就是使用该目录下的库;
* 我们所需要的头文件在arm-none-linux-gnueabi/libc/usr/include/目录下的。
如果以后遇到某程序需要的库,自行编译后添加到编译器中就可以了。到此适合我们的交叉编译器的初步制作算是结束了,然后我们可以将其打包备份。
然后我们需要高明白两件事情:
1、 我们所需要使用的交叉编译器的库(lib)的路径是:arm-none-linux-gnueabi/libc/armv4t/lib/目录下的,我们制作文件系统是就是使用该目录下的库;
2、 我们所需要使用的头文件在arm-none-linux-gnueabi/libc/usr/include/目录下的。
然后我们添加编译QT所必须的库:jpegser.v6.tar.gz、libpng、libz和libuuid(e2fprogs),我们在一直好这些库之后,需要将其拷贝到前面提到的目录中(包括lib和include)。
如果以后遇到某程序需要的库,自行编译后添加到编译器中就可以了。到此适合我们的交叉编译器的初步制作算是结束了,然后我们可以将其打包备份。
3)环境变量配置
配置文件在 /etc/enviroment
1.
- sudo cp /etc/enviroment /etc/environmet.old
2.
- sudo vim /etc/enviroment
- 修改如下:我们添加了 /home/ywx/arm-cross/arm-2010.09/bin,因为我们解压文件到了/home/ywx/arm-corss下
- PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/ywx/arm-cross/arm-2010.09/bin:"
重启环境变量或重启计算机就好了。我们需要重启计算机
如此:自己制作的编译器就制作成功了。当要注意的一定,这个编译支持EABI技术的,所以要求编译的目标内核也要支持这个技术,linux2.6.16以后的内核都支持了。之前的交叉编译器不支持EABI技术。