嵌入式交叉编译环境搭建

时间:2020-12-29 14:52:51

参考资源:交叉编译器arm-linux-gcc

(一)交叉编译器简介

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。

(二)体系结构与操作系统

(1)常见的体系结构有ARM结构、x86结构等。

(2)常见的操作系统有Linux,Windows等。

(3)同一个体系结构可以运行不同操作系统,如x86上可以运行Linux、Windows等,在ARM上可以运行Linux、WinCE。

(4)同一个操作系统可以在不同的体系结构上运行,比如Linux可以运行在x86上,也可以运行在ARM上。

(5)同样的程序不可能运行在多个平台上,比如Windows下应用程序不能在Linux下运行。如果一个应用程序想在另一个平台上运行,必须使用针对该平台的编译器,来重新编译该应用程序的二进制代码。比如在Linux系统下运行Windows平台的QQ软件,必须按照以下几个步骤:

1、使用编辑器编写QQ程序源代码。

2、使用Linux下的编译器来编译QQ软件的源代码。

这样编译出来的可执行程序就可以在Linux下运行了。所以如何使ARM来运行用户的应用程序呢,就需要用到针对ARM的编译器来编译程序。

(三)使用交叉编译器的原因

ARM上可以运行操作系统,所以用户完全可以将ARM当做计算机来使用,理论上也可以在ARM上使用本地的编译器来编译程序。但是,编译器在编译程序时,会产生大量的中间文件,这会占用很大的内存和磁盘空间,且对CPU处理速度要求较高,比如S3C2440A内存、磁盘空间只有几十到100多兆,CPU只有400-500MHz,完全达不到编译程序的要求.所以,在进行ARM-linux嵌入式开发时必须在PC机(x86结构)上编译出能够运行在ARM上的程序,然后再将程序下载到ARM中来运行.这就用到了交叉编译器。

要进行交叉编译,用户需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译用户的源代码,最终生成可在目标平台上运行的代码。交叉编译工具链可以从网上下载,也可以自己制作。但编译器不是万能的,受版本限制,编译某些程序时会报错。常见的交叉编译工具链有:

(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就是一种编译规范,交叉编译器在编译时,对于浮点运算会使用硬浮点运算,而对于没有硬浮点运算的处理器,比如S3C2440,会使用软浮点,但这样会在速度上受到很大的限制,而EABI则对浮点运算进行了优化,提高了浮点运算的性能,节省了编译时间。

(四)安装交叉工具链arm-none-linux-gnueabi-gcc

安装交叉编译器arm-none-linux-gnueabi-gcc就是在主机平台(pc机的Linux操作系统)上安装对应的交叉编译工具链,换句话说,是将交叉编译器arm-none-linux-gnueabi-gcc在Linux操作系统下安装。安装步骤:

(1)下载交叉编译工具链压缩包arm-none-linux-gnueabi-gcc-for-linux.tar.bz2到/home/ryan/document目录下。

(2)切换至root用户:

[ryan@localhost ~]$ su - root
Password:
[root@localhost ~]#

(3)从arm-none-linux-gnueabi-gcc-for-linux.tar.bz2压缩包解压信息来看,该软件包解压的主要目录是usr/local/arm,可直接解压到/目录下:

[root@localhost document]# tar -xjvf arm-none-linux-gnueabi-gcc-for-linux.tar.bz2 -C /

(4)此时还不能编译源码,系统一般会提示找不到命令arm-none-linuc-gnueabi-gcc,需要修改环境变量:(有3种方法)

方法一:在当前终端下设置

[root@localhost ~]# export PATH=$PATH:/usr/local/arm/arm-none-linux-gnueabi/bin
方法二:修改/etc/bashrc配置文件

[root@localhost ~]# vim /etc/bashrc
在最后加上export PATH=$PATH:/usr/local/arm/arm-none-linux-gnueabi/bin,可以不用重启电脑,使新的环境变量立即生效

[root@localhost ~]# source /etc/bashrc
方法三:修改/etc/profile配置文件

[root@localhost ~]# vim /etc/profile
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC 这一行的下面添加环境变量
    输入
export PATH=$PATH:/usr/local/arm/arm-none-linux-gnueabi/bin
    指定变量PATH为交叉编译器的路径,目的是告诉操作系统可以到目录/usr/local/arm/arm-none-linux-gnueabi/bin下查找可执行文件
[root@localhost ~]# source /etc/profile
(5)查看arm-none-linuc-gnueabi-gcc编译器版本
[root@localhost ~]# arm-none-linux-gnueabi-gcc -vUsing built-in specs.Target: arm-none-linux-gnueabiConfigured with: /scratch/julian/lite-respin/linux/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2008q3-72' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/binThread model: posixgcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)