您的位置:首页 > 其它

什么是交叉编译?

2009-12-05 22:54 267 查看
注:
此贴转自我们以前的Google协作平台!

什么是交叉编译?

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器

支持交叉编译。这个编译过程就叫交叉编译

。简单地说,就是在一个平台上生成另一个平台上的可执行

代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统
(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构

上运行。举例来说,我们常说的x86
Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;

而x86 WinNT平台实际上是Intel
x86体系结构和Windows NT for
x86操作系统的简称。有时是因为目的平台

上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台

上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,

根本谈不上运行什么编译器。交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们

常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译成

计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual
C++开发环境,编写

程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可

执行程序,这种编译过程称为native
compilation,中文可理解为本机编译。然而,在进行嵌入式系统的

开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM
平台,其一般的静

态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台

上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation
tool
chain)需要很大的存储空

间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,

我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程

序。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool
chain),

然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译

例子如下:

在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的 可执行代码。

在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。

在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。

我们应该怎样建立交叉编译环境

OK,这里来到了重点。我们知道了什么是交叉编译环境,那我们到底应该怎么开始呢?

网上有很多建立交叉编译环境的傻瓜教程,比如:

IBM的《如何为嵌入式开发建立交叉编译环境


huihoo的
一步一步的制作arm-linux交叉编译环境



这些都是很权威的交叉编译环境建立的教程,尽管如此我们还是会被这些东东“吓到”;可是从另外一个角度来看我们没有必要来这样做,因为我们的目的是应用这个环境来开发我们的应用程序,所以我们应该尽可

能少的在建立环境的阶段纠缠不清。好在情况不是很坏,网上有很多已经编译好的交叉编译环境的package

供我们下载使用。比如http://ftp.kelp.or.kr/pub/arm-linux/toolchain/
http://ftp.handhelds.org/projects/toolchain/
http://www.handhelds.org/download/projects/toolchain/
,有几款公认的比较稳定的版本:

2.95.3

3.4.5

4.2.1

一般我们编译程序和编译器的版本没有关系,不乏特殊情况,比如在移植Qtopia4.x.x的时候,官方文档

就要求使用3.2.x以上的编译器。另外,如果编译过程中遇到了很奇怪的问题无法解决时,可以考虑换一个编

译器版本试试。

下面我们以arm-linux-gcc-3.4.1为例介绍交叉编译环境的建立。

http://ftp.handhelds.org/projects/toolchain/
下载arm-linux-gcc-3.4.1.tar.bz2

$ cd /work/src

$ wget http://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2


解压缩到/usr/local

$ cd /usr/local

$
tar jxf /work/src/arm-linux-gcc-3.4.1.tar.bz2


*注意*

建议不要使用tar的"v"参数,如果解压的文件比较大的话,使用"v"参数与不使用这个参数的解压速度有很大区别。

此时此文件夹下产生`usr`文件夹,在`usr/local`文件夹下有我们想要的文件夹`arm`,它的绝对路径是`/usr/local/usr/local/arm`,因此使用下面命令把`/usr/local/usr/local/arm`移到`/usr/local/arm`

$ mv usr/local/arm
./


交叉编译工具此时存在于`/usr/local/arm/3.4.1/bin/`

$ ls
usr/local/arm/3.4.1/bin/


arm-linux-addr2line
arm-linux-cpp arm-linux-gcov arm-linux-ranlib

arm-linux-ar
arm-linux-g++ arm-linux-ld arm-linux-readelf

arm-linux-as
arm-linux-gcc arm-linux-nm arm-linux-size

arm-linux-c++
arm-linux-gcc-3.4.1 arm-linux-objcopy arm-linux-strings

arm-linux-c++filt
arm-linux-gccbug arm-linux-objdump
arm-linux-strip

为了方便,我们需要把这个文件夹加到系统变量`PATH`里面,这样我们就可以像使用系统变量一样使用

这些命令了。编辑`~/.bashrc`,这个文件是隐藏文件,当用户登入时就会首先执行这个文件,因此我们

可以把设置环境变量的命令写进去。

$ echo "export
PATH=$PATH:/usr/local/arm/3.4.1/bin" >> ~/.bashrc

$ source
~/.bashrc


到此为止,我们的交叉编译器就算搞定了,是不是不是想象中的那么难?^_^

创建日期: 2009-5-17

xxx 于 xxx
修改

(修改者请在此处按以上格式添加信息)

Author: Rjz

Email :jiangzhe78@gmail.com

All rights
reserved to 长大-Linuxers
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: