闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕濡ょ姷鍋為悧鐘汇€侀弴銏犖ч柛灞剧煯婢规洖鈹戦缁撶細闁告鍐f瀺鐎广儱娲犻崑鎾舵喆閸曨剛顦繝鈷€鍕垫疁妤犵偛妫濆顕€宕煎顏佹櫊閹鏁愭惔婵堝嚬閻庣懓鎲$换鍕閹烘挻缍囬柕濞垮劤閻熴劌顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秶鍠栭幃娆撳箣濠靛洤顦╅梺鎶芥敱閸ㄥ湱妲愰幘瀛樺濠殿喗鍩堟禍婵嬪箞閵娾晛鐐婇柕濞垮€楃粻姘渻閵堝棛澧柣鏃戝墴閻擃剟顢楅崒妤€浜鹃悷娆忓绾炬悂鏌涙惔锝嗘毈鐎殿噮鍋婇獮妯肩磼濡粯顏熼梻浣芥硶閸o箓骞忛敓锟�濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌熼梻瀵割槮缁炬儳顭烽弻锝夊箛椤掍焦鍎撶紓浣哄С閸楁娊寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磽娴e搫啸闁哥姵鐗犲濠氬Ω閳哄倸浜滈梺鍛婄箓鐎氬懘濮€閵堝棛鍘遍梺闈浨归崕閬嶅焵椤掆偓濠€閬嶅箲閵忕姭妲堥柕蹇曞Т閼板灝鈹戦埥鍡楃仴妞ゆ泦鍥棄鐎广儱顦伴埛鎴犵磼鐎n偒鍎ラ柛搴㈠姉缁辨帞鎷犻幓鎺撴婵犵绱曢弫璇茬暦閻旂⒈鏁嶆慨妯夸含閺夋悂姊绘担鍝ユ瀮婵℃ぜ鍔庨幏瀣蓟閵夈儳锛涢梺瑙勫礃椤曆囧礃閳ь剟鎮峰⿰鍐炬█鐎殿喗鎮傚顕€宕奸悢鍝勫汲闂備胶绮ú鏍磹閸︻厸鍋撳鐐
开发学院软件开发C++ 交叉编译 阅读

交叉编译

 2008-03-08 21:58:53 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣椤愯姤鎱ㄥ鍡楀幊缂傚倹姘ㄩ幉绋款吋閸澀缃曢梻鍌欑濠€閬嶆惞鎼淬劌绐楅柡宥庡亞娑撳秵銇勯弽顐沪闁绘挶鍎甸弻锝夊即閻愭祴鍋撻崷顓涘亾濮樼偓瀚�闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕濡ょ姷鍋涢ˇ鐢稿极閹剧粯鍋愰柟缁樺笧閳ь剦鍙冨鍝勑ч崶褏浠奸梺璇茬箲閼归箖鎮鹃悜钘夎摕闁靛濡囬崢鐢告⒑鐟欏嫷鍟忛柛鐘崇墵閵嗗倹绺介崨濠勫幈闁硅壈鎻槐鏇熺墡闂備線娼уú銈団偓姘嵆閻涱噣骞掑Δ鈧粻锝嗙節闂堟稑鏆欏ù婊堢畺閺岋綁濮€閳惰泛婀辨竟鏇熺節濮橆厾鍘甸梺缁樺姦閸撴岸鎮樻潏銊ょ箚闁圭粯甯炴晶娑氱磼缂佹ḿ娲寸€规洖宕灃闁告劕鍟犻崜婵堟崲濞戞ḿ鏆嗗┑鐘辫兌閺佹牜绱撴担浠嬪摵闁圭懓娲ら悾鐑藉箳閹搭厽鍍甸梺鐟板悁閻掞箓鎮楅幖浣光拻濞达絿鍎ら崵鈧梺鎼炲€栭悧鐘荤嵁韫囨稒鏅搁柨鐕傛嫹婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繑銇勯幘鍗炵仼缂佺媭鍨堕弻娑㈠箛闂堟稒鐏堥悗鐟版啞缁诲啴濡甸崟顖氱閻庨潧鎽滈悾濂告⒑绾拋娼愭繛鑼枎椤繒绱掑Ο鑲╂嚌闂侀€炲苯澧畝锝堝劵椤︽煡鎮¢妶澶嬬厪闁割偅绻冮崑顏呯箾瀹割喕绨婚幆鐔兼⒑鐎圭姵銆冮柤鍐茬埣瀹曟繈鏁冮埀顒勨€旈崘顔嘉ч柛鈩冾殘閻熸劙姊洪悡搴℃毐闁绘牕銈稿畷鐑樼節閸パ冨祮闂侀潧楠忕槐鏇㈠储椤忓牊鈷戦柟鑲╁仜閸旀鏌¢崨顔锯姇缂佸倹甯熼ˇ瀵哥磼鏉堛劌绗氭繛鐓庣箻閸┾剝鎷呴柨瀣垫綗闂傚倷娴囧銊╂倿閿曞倸绠查柛銉墮閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣椤愯姤鎱ㄥ鍡楀幊缂傚倹姘ㄩ幉绋款吋閸澀缃曢梻鍌欑濠€閬嶆惞鎼淬劌绐楅柡宥庡亞娑撳秵銇勯弽顐沪闁绘挶鍎甸弻锝夊即閻愭祴鍋撻崷顓涘亾濮樼偓瀚�  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸ゅ嫰鏌ら崫銉︽毄濞寸姵姘ㄧ槐鎾诲磼濞嗘帒鍘$紓渚囧櫘閸ㄥ爼濡撮崘顔煎窛闁哄鍨归崢娲倵楠炲灝鍔氭い锔诲灦瀹曪繝骞庨懞銉у帾闂婎偄娲﹀ú鏍ㄧ墡闂備浇顕х€垫帡宕滈悢濂夋綎闁惧繐婀辩壕鍏间繆椤栨碍鎯堟い顐㈢Т椤啴濡堕崱妤€顫庨梺鍛婎焼閸パ呭弨婵犮垼娉涜癌闁绘柨鍚嬮悡銉╂倵閿濆骸鍘撮柛瀣尰缁绘繂顫濋娑欏闁荤喐绮庢晶妤冩暜閹烘挾顩插ù鐓庣摠閻撴洟鏌熼幆褜鍤熼柍钘夘樀閺屽秶绱掑Ο鑽ゅ弳濡炪値鍋呯换鍫ュ箠濠婂懎鏋堟俊顖濐嚙椤忓綊姊婚崒娆戭槮闁硅绱曠划娆撳箣閿斿搫浜奸梺鍝勵槹閸ㄧ喖寮搁弮鍫熺厸闁告劧绲芥禍鍓х磽娴h櫣甯涚紒瀣尰缁傛帡鏁冮崒姘憋紲濠殿喗锕╅崜锕傛倵閹惰姤鈷掑ù锝呮憸閿涘秶绱掗鍛仸妤犵偞鍨垮畷鍫曨敆閸屾氨銈﹂梺璇插嚱缂嶅棙绂嶉弽顓炵哗濞寸姴顑嗛悡娆撴⒑椤撱劎鐣卞褜鍨遍妵鍕棘閸喒鍋撶憴鍕攳濠电姴娲﹂崐閿嬨亜韫囨挸顏ら柛瀣崌瀵€燁檨婵炲吋鐗曢埞鎴︽偐鐎圭姴顥濋梺绋胯閸斿酣骞夊宀€鐤€婵炴垶岣块悿鍛存⒑閸︻叀妾搁柛鐘愁殜瀵煡骞栨担鍦弳闂佺粯娲栭崐鍦偓姘炬嫹
核心提示:OpenARM-CrossCompile-HOWTO一、版权说明目的:本版权声明的目的是希望保证任何人能够真实、有效地享有使用本版权说明所约束的文档的充分自由;同时,保护文档原作者的权利,交叉编译,不仅使他们得到应得的荣誉,而且保证原作者不对因其他人的改动而导致的后果负任何责任,http://crossgcc.bill

  OpenARM-CrossCompile-HOWTO

一、版权说明
目的:
本版权声明的目的是希望保证任何人能够真实、有效地享有使用本版权说明所约束的
文档的充分自由;同时,保护文档原作者的权利,不仅使他们得到应得的荣誉,而且
保证原作者不对因其他人的改动而导致的后果负任何责任。

声明:
a、除非另外声明,文档的版权是属于其作者的。本计划所有文档作者保留所有权利。

b、由本计划所生成的自由文档答应每个人自由的使用(包括对本文档进行各种商业性
的或是非商业性的复制和再分发),而无须向 OPENARM 计划或作者支付任何费用,条
件是本版权声明出现在所有的副本中,并且,自由文档版权声明神圣不可侵犯,使用者
不得对声明中的任何条款作任何形式的修改,也不得附加任何其它的条件。

c、答应任何人在遵循本版权声明的前提下对自由文档进行修订后再复制和发布。假如
您修订了自由文档或者发布了修订版本的副本,您就不再是一般意义上的使用者而成为
修订人,这些规定就转化为你的责任。修订人应遵循如下规定:

1。修订版应含有与上一版本具有相同内容的自由文档版权声明,但就其所修改的部分,
修订者拥有其自己的版权。
2。保护原作者以及前期版本的修订者的署名权。修订者应在修订版本中保留原作者以及
前期修订者的姓名及联系方式
3。专门建立并保留一部分内容名为“历史纪录”,针对每一版本的修订,记录该版本
的作者,修订时间,联系方式及发布者等相关信息
4。修订者有告诉读者如何获得上一版本文档的义务,假如是在网站上发布,应做出指
向上一版本文档位置的链接

d、任何人可以引用本文档中的一部分内容,或是将一部分本文档内容与其他文档内容
混合在一起使用,条件是必须在引用的文档部分中加入本版权声明。对上述行为可依
照 c 项规定办理

e、转译。假如需要根据本计划中文档转译为其它种语言,此种行为将被视同为对修订
版本的再次修订,可依照 c 项规定办理。

f、在任何情况下,原作者不承担因使用本文档而导致的对任何当事人所造成的直接的,
间接的,非凡的,附加的或者相伴而生的损坏,包括利益损失的责任,即使原作者在文
档中已经建议了这些损失的可能性时也是如此。





二、什么是交叉编译
什么是交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注重的是所谓
平台,实际上包含两个概念:体系结构(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软件首先被执行。



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

待续。。。。。。



六、参考文献
http://www.objsw.com/CrossGCC/ 这是一个老牌的交叉编译FAQ,可惜最近已经很少更新了。
http://crossgcc.billgatliff.com/ 这是一个新生的交叉编译FAQ,目前更新比较频繁。
crossgcc@sourceware.cygnus.com 交叉编译器的邮件列表。

Tags:交叉 编译

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接