什么是交叉编译?

news/2024/6/29 12:02:59 标签: 编译器, 平台, linux, x86, 制造, bash

  

什么是交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓
平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结
构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说
x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是
Intel x86
体系结构和Windows NT for x86操作系统的简称。

一个经常会被问到的问题就是,既然我们已经有了主机编译器,那为什么还要交叉编译呢?其实答案很简
单,没办法啊!有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器
的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没
有建立,连操作系统都没有,根本谈不上运行什么编译器

另一个经常会被问到的问题就是:既然可以交叉编译,那还要主机编译干吗?其实答案也很简单,交叉编
译是不得已而为之!与主机编译相比,交叉编译受的限制更多,虽然在理论上我们可以做任何形式的交叉编
译,但事实上,由于受到专利、版权、技术的限制,并不总是能够进行交叉编译,尤其是在业余条件下!举
例来说,我们至今无法生成惠普公司专有的som格式的可执行文件,因此我们根本无法做目的平台
HPPA-HPUX
的交叉编译。

就我们这个项目而言,需要交叉编译的原因有两个:首先,在项目的起始阶段,目的平台尚未建立,因此需
要做交叉编译,以生成我们所需要的bootloader(启动引导代码)以及操作系统核心;其次,当目的平台
启动之后,由于目的平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。



三、交叉编译的基础知识
在做实际工作之前,我想我们应该先掌握一些关于交叉编译的基本知识,其实说白了也就是理解一些我们经
常会碰到的英文单词;)

host
主机平台
target
目的平台
perfix
交叉编译器的安装位置。
xxx-xxxx-xxxxx
平台描述。

我们在主机平台上开发程序,并在这个平台上运行交叉编译器,编译我们的程序;而由交叉编译器
成的程序将在目的平台上运行。这里值得说明得是平台描述,象arm-linuxi386-pc-linux2.4.3这样的字
符串我们经常会看到,其实它是用来描述平台的,它有完整格式、缩减格式和别名之分。完整格式是:
CPU-
制造厂商-操作系统,如sparc-sun-sunos4.1.4,说明平台所使用的CPUsparc制造厂商是sun,上面
运行的操作系统是SunOS,版本是4.1.4。当然,我们都不愿记这么长的东西,因此可以使用短格式,短格式
中有选择地去处了制造厂商、软件版本等信息,因此我们同样可以用sparc-sunossparc-sunos-sunos4
描述这个平台。如果觉得这个还是太麻烦,那就可以使用别名,sun4m就可以很简单地描述这个平台。需要
注意的是,并不是所有的平台都有别名,也不是所有的短格式都可以正确地描述平台



四、我需要准备些什么
怎么说呢,你先得准备好主机平台,对我们这个项目来说,我们建议采用x86 Linux做主机平台,因为这样需
要的设置工作最少。当然你也可以使用你所喜欢的平台或你所能得到的平台,其中的区别在于你可能必须做
更多的设置工作,当然也有这种可能,就是你所选择的主机平台根本不能生成适用于目标平台的正确的交叉
编译器

对于交叉编译器,可以自己生成,也可以从网上下载。区别在于从网上下载非常简单方便,但也许你找不到
适合你所选择的平台的。而自己生成交叉编译器,有时会遇到很多挫折,但这的确是个有趣的值得怀念的经
历。

如果你想自己生成交叉编译器,那你必须先准备下面这些东西

1
、磁盘空间。至少要500M左右的空间,如果想一气呵成的话,那就要900M-1G的空间。
2
、各种源代码。你至少要准备binutils-2.11.2gcc-2.95.3linux-2.4.6newlib-1.8.2glibc-2.2.2
的源代码。


如果你所使用的主机平台不是运行的linux,那你还必须注意以下这些问题

1
GNU bash必须是默认shell,所以你也许得把/bin/sh改成bash
2
、你要确认已经安装了GNU bison,因为这些软经同样使用了bison扩展。
3
GNU gmake最好是系统默认得make,因为这些软件都使用了gmake扩展,如果不是,在需要make时,记得
使用gmake
4
、如果你想生成交叉glibc,则GNU gsed必须是默认sed,因为glibc会用到gsed的扩展。
5
、如果你想生成交叉glibc,那还必须准备glibc-linuxthreads-2.2.2的源代码。
6
、确认正确的路径搜索顺序,最好让GNU软件首先被执行。



五、怎样生成交叉编译器
我们建议使用现成的脚本来生成交叉编译器,因为在配置交叉编译器时,会经常使用一些难以理解的开关项

 


http://www.niftyadmin.cn/n/1713890.html

相关文章

本学期计划

比起以前的我,我感觉自己变了很多,尤其在学习方面,重在理解,关键在思考,学东西注意方法,先做出一个小例子出来,再在理解的基础上添加自己的想法,我从今天开始正式学习C,做…

QT读取TXT文件显示中文

在XP下写入你想要的中文,注意保存的时候保存为UTF-8格式,其它格式的话就要看你的 QT了,反正我的QT只能支持UTF-8格式的了!什么GB18030,GBK、GB1232之类的,我的QT都没有办法运行。应该是没有这个格式&#x…

小马过河

我现在的状况使我想到了上小学那时候学过的一篇名叫《小马过河》的课文,我决计学习C,在此之前,我有过犹豫和不安,因为我问过一些比我大几岁的人,看看他们的想法,有的说C很难,不是一般人能学会的…

堆和栈的区别(被转了无数次的好文章)

一、预备知识—程序的内存分配 一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区&#xf…

科学付出 高效学习

最近一直在学习C和MFC,我们以前曾经开过VC的课程,但现在重新学习它,感觉以前学的连皮毛都不够,所以我计划通过看书本结合孙鑫的视频加上一些小例子来系统的来学习。昨天晚上我和平时一样在上机练习,也就是随意的向后面…

C++ 对文件流的操作

前些日子,我做一个小东西是用到了C对文件流的操作,当我做到对文本文件修改的时候遇到问题,只能将文件的内容读出来,却怎么都修改不了,后来我通过查资料了解到: ifstream 流是文件的输出操作,可以…

收藏:七年IT经验的七个总结

1、分享第一 条经验:“学历代表过去、能力代表现在、学习力代表未来。” 其实这是一个来自国外 教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要:“重要的道理明白 太晚将抱憾终生!”所…

预编译头文件Stdafx.h详细解读

预编译头文件 今天在改一个很大的程序,慢慢看,慢慢改。突然发现一个.c文件,里面什么也没有, 就几个头文件,我一看,我靠,这不是把简单的问题搞复杂了吗,随手删掉那个c文件。 结果不…