什么是交叉编译?

  • 什么是交叉编译?
           在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器
    支持交叉编译。这个编译过程就叫交叉编译
    。简单地说,就是在一个平台上生成另一个平台上的可执行
    代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(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为例介绍交叉编译环境的建立。


    $ 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



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值