什么是交叉编译?

来源:互联网 发布:南京大学网络本科报名 编辑:程序博客网 时间:2024/04/30 07:19

 

  • 注:此贴转自我们以前的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),
然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译
例子如下:
  1. 在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的 可执行代码。
  2. 在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
  3. 在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。

  • 我们应该怎样建立交叉编译环境
OK,这里来到了重点。我们知道了什么是交叉编译环境,那我们到底应该怎么开始呢?
网上有很多建立交叉编译环境的傻瓜教程,比如:
  1. IBM的《如何为嵌入式开发建立交叉编译环境》
  2. 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