LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3990|回复: 20

[编译原理]什么是cross compiling?

[复制链接]
发表于 2005-8-5 11:31:51 | 显示全部楼层 |阅读模式
rt. 和一般的编译有什么不同?原理是什么?有什么优势?
发表于 2005-8-5 11:39:03 | 显示全部楼层
差不多就是在一个平台为另一个平台编译东东。比如新造了一个操作系统,该系统本身自己没办法编译自己,于是只好借助其他系统来cross compiling了。感觉就是借鸡生蛋了
回复 支持 反对

使用道具 举报

发表于 2005-8-5 11:42:47 | 显示全部楼层
http://www.linuxeden.com/doc/article.php/21264

什么是交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓
平台,实际上包含两个概念:体系结构(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-linux、i386-pc-linux2.4.3这样的字
符串我们经常会看到,其实它是用来描述平台的,它有完整格式、缩减格式和别名之分。完整格式是:
CPU-制造厂商-操作系统,如sparc-sun-sunos4.1.4,说明平台所使用的CPU是sparc,制造厂商是sun,上面
运行的操作系统是SunOS,版本是4.1.4。当然,我们都不愿记这么长的东西,因此可以使用短格式,短格式
中有选择地去处了制造厂商、软件版本等信息,因此我们同样可以用sparc-sunos或sparc-sunos-sunos4来
描述这个平台。如果觉得这个还是太麻烦,那就可以使用别名,sun4m就可以很简单地描述这个平台。需要
注意的是,并不是所有的平台都有别名,也不是所有的短格式都可以正确地描述平台。



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

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

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

1、磁盘空间。至少要500M左右的空间,如果想一气呵成的话,那就要900M-1G的空间。
2、各种源代码。你至少要准备binutils-2.11.2、gcc-2.95.3、linux-2.4.6、newlib-1.8.2或glibc-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软件首先被执行。



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

使用道具 举报

 楼主| 发表于 2005-8-5 13:23:13 | 显示全部楼层
爽 这是一篇好文。看了之后了解了很多知识。我从未为其他类型的机器编译过东西,现在知道了我也可以在我的PC机上生成其他平台可用的代码。文章最后没有指明具体做法,我的理解是在CFLAGS
和CXXFLAGS处指定非host机类型的平台,是不是就可以为某个指定的目标平台编译代码了呢?
回复 支持 反对

使用道具 举报

发表于 2005-8-5 20:12:08 | 显示全部楼层
There are several hints in linuxfromscratch.org

You may do a google search for them.
回复 支持 反对

使用道具 举报

发表于 2005-8-6 08:19:29 | 显示全部楼层
好,以后欢迎各位多来这个发好帖!支持我们基础理论版,支持我这个九流斑竹,
回复 支持 反对

使用道具 举报

发表于 2005-8-6 12:02:20 | 显示全部楼层
九流斑竹??? Why???

When this page lacks a competent moderator to maintain the page, you stand up.

We are very proud of you.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-6 12:24:13 | 显示全部楼层
Post by d00m3d
九流斑竹??? Why???

When this page lacks a competent moderator to maintain the page, you stand up.

We are very proud of you.


Absolutely right! Hey genv, YOU ARE THE ONE!
回复 支持 反对

使用道具 举报

发表于 2005-8-10 08:49:06 | 显示全部楼层
交叉编译在实际中用到的名词一般是
宿主机---就是我们的pc机了,协助开发用的工具
目标板---一般是我们要开发的开发板,比如我现在用的Intel Xscal PXA255开发板,其cpu是intel xscal,主频400Mhz,板上带有64MSDRAM和32M Nand Flash(这里的cpu相当于我们pc的CPU,SDRAM相当于pc的内存,NAND flash充当pc的硬盘,因为嵌入式条件限制,比如cpu,内存,flash都不会太大,所以只能通过交叉编译生成目标板上可以使用的bootloader,kernel,filesystem,应用程序,如果我们的嵌入式硬件发展到了跟现在的pc一样了,恐怕也用不到交叉编译了)
交叉编译工具---比如arm-linux-gcc, arm-linux-g++, 等,跟pc上的编译工具一一对应,只是前面加了目标板的符号。

所以我感觉,做嵌入式就类似于在我们的pc上安装系统,运行应用程序,只不过这些工作都必须在我们pc环境下完成,然后通过串口或者网线传到目标板上来应用,典型例子就是PDA等手持设备,当然最近除了linux外,微软也在努力开发嵌入式应用,他们的产品WindowsCE从4.0以后应用很广,而且稳定性也得到了大家的认可,目前也是嵌入式中应用较多的操作系统,其原因我感觉是目前毕竟使用Windows下编程的人也不少,而WindowsCE正好迎合这批人,因为其开发环境用的大部分是VC语言,懂VC的很快会入门,所以目前应用较广。
回复 支持 反对

使用道具 举报

发表于 2005-8-29 14:28:51 | 显示全部楼层
但是wince怎么说也是商业软件
他的代码不开放
你要做也只能做app
想做kernel等与硬件打交道的底层的东西
还是linux好些吧
UClinux
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表