当前位置:  技术问答>linux和unix

怎么样实现交叉编译?求教!

    来源: 互联网  发布时间:2015-03-12

    本文导语:  请教! | 交叉编译  OpenARM-CrossCompile-HOWTO  一、版权说明  目的:  本版权声明的目的是希望保证任何人能够真实、有效地享有使用本版权说明所约束的  文档的充分自由;同时,保护文档...

请教!

|
交叉编译 

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 交叉编译器的邮件列表。 



    
 
 

您可能感兴趣的文章:

  • 求教用一个端口能否实现3G视频传输
  • 求教各位大大:关于vi或top命令出现的界面,如何编程才能实现?
  • 诚心求教:这样能实现吗?
  • 求教,Linux下如何编程实现播放视频文件?
  • 求教:嵌入式linux如何实现简单&高性能的qos?
  • 求教:用Linux命令行实现文中的3个操作
  • 请指教,在java.Swing中如何实现这样的功能?求教!送分!
  • 关于B/S结构的客户端打印的问题,求教各位 各位大虾,我用servlet和jsp作了一套b/s的系统,现在客户端需要打印,怎样才能实现?帮帮忙啊,小弟再此先谢过了!
  • 求教一个实现字符串替换的小函数
  • 150分求教用JavaBean实现文件上载方法
  • fork 通讯服务器 并发实现的问题 ?求教!!!!!
  • 求教:Unix下用c实现文本文件的随机读写的问题!!!
  • 编译器是怎么实现的?????
  • 共享库如何在编译的时候确定哪些函数没有实现?
  • 怎样实现将资源编译进可执行文件中?
  • 请问各位高手,怎么样在windows上通过批处理脚步启动solaris上的编译器,实现自动编译?(solaris通过telnet登陆)?
  • 关于XP系统下批处理文件如何实现执行linux下脚本,从而实现版本的自动化编译
  • 请教为什么在C++编译通过并实现的程序,在linux下就会出错
  • 想重新编译usb-storage.o,如何实现
  • C#实现将记事本中的代码编译成可执行文件的方法
  • 跨平台编译可以实现吗?
  • 求救呀:我用QT编了一个界面程序,怎么实现静态编译好让那个程序也能在没有装QT的系统上运行呀!!!
  • 在linux下用gcc编译时能不能实现“选择”的静态连接呢?
  • python实现sublime3的less编译插件示例
  • codeblocks8.02 for linux,程序可以编译通过,但是通过右键“查找fopen函数的声明”或“实现”,都是提示“没有找到:fopen”,为什么
  • HTML教程 iis7站长之家
  • android apk反编译到java源码的实现方法
  • linux c实现shell,但出现编译后,不能链接,望高手指点指点,谢谢啦
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • MySQL交叉表实现分享
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • boost unordered_map和std::list相结合的实现LRU算法
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • linux下如实现与window下的驱动器实现文件共享??
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • qt如何实现:操作键盘实现数据的滚动?
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3