如何得到交叉编译器

时间:2024-02-20 14:34:37

 

了解了之前的交叉编译器的命名规则后,也就明白了交叉编译,针对不同架构,平台,目标系统等的区别。

而对于嵌入式开发,想要获得,针对我们所需要的,目标的CPU所合适的交叉编译器,就成了接下来,顺其自然要考虑的事情。

想要得到,可用的,针对自己的CPU的交叉编译器,主要有两种方式:

3.2.1. 拿来主义:直接去下载和使用别人已经编译好的交叉编译器

难度等级:1级

这个没有啥特殊要求解释的,就是,网上,总会有,免费的,好用的各种资源的。

其中就包括,别人,已经针对某些CPU,某些平台,编译好了交叉编译器了

而你要做的事情就是:找到合适的,并下载下来使用。

关于网上,现存的,可用的,针对arm的交叉编译器,可以参考我之前整理的一些:

【整理】arm的交叉工具链(交叉编译器)下载

 

[提示] 常见的,获得交叉编译器的方式

其实,相对比较常见的,获得可用的,交叉编译器的方式是:

当你购买某一家的(嵌入式)开发板的时候,然后开发板厂家,提供你对应的硬件开发板的同时,也提供对应的整套开发软件。

此处,整套的开发软件,其中就包括,对应的,用来编译其厂家提供的BSP的软件源码的,交叉编译器。

即:一般来说,你买了某家的某款的嵌入式开发板的时候,就送了对应的交叉编译器

例 3.5. 购买了TQ2440的开发板,就送了对应的交叉编译器

拿我之前,购买的TQ2440的开发板为例

买了TQ2440的开发板的时候,就送了对应的光盘了。

光盘里面,就包含了对应的各种开发资料和交叉编译器

其实,对于交叉编译器本身,TQ2440的厂家,叫做天嵌公司,其本身有自己的论坛,论坛里面,也可以免费下载到对应的交叉编译器的

[光盘下载] 2010年6月 最新TQ2440光盘下载 (Linux内核,WinCE的eboot,uboot均有更新)

 

3.2.2. 自己动手,丰衣足食:自己去编译出来一套自己想要的交叉编译器

如果网上没有合适的交叉编译器,那么就需要你手动去制作了。

自己手动制作交叉编译器,又分两种:

3.2.2.1. 白手起家从头开始制作交叉编译器

难度等级:10级

此法,目前我也还没折腾过

只是知道,难度,相对是最大的

等抽空折腾了之后,再总结出来。

 

3.2.2.2. 借助别人的工具去制作交叉编译器

难度等级:6级

相关旧帖:【整理】交叉编译和现存的交叉编译工具

对于,制作交叉编译器这样的事情,本身是很需要技术含量,和很耗时的事情

所以,对此,现在现存很多相关的工具,以简化制作交叉编译器这个事情的复杂度,帮你节省很多精力和时间

而你所要做的事情就只是:

了解有哪些工具,选个合适的工具,搞懂如何使用,用其制作出你所需要的交叉编译器,即可。

关于现在有哪些交叉编译器的制作工具,正是下文正要详细解释的:

第 3.3 节 “各种制作交叉编译器的工具”

3.3. 各种制作交叉编译器的工具

下面,就针对,现存已知的,交叉编译器,的制作工具,进行简单的总结和介绍:

 

3.3.1. crosstool-NG

crosstool-ng的主页:http://crosstool-ng.org/

 

关于crosstool-ng的更多介绍和使用,可以参考我的另外一个教程:

crosstool-ng详解

3.3.2. Buildroot

Buildroot主页:http://www.buildroot.net/

特点:不仅能制作交叉工具链,而且还可以制作根文件系统rootfs。而且还支持同时编译对应的Linux内核和Uboot。

 

 

关于Buildroot的更多介绍和使用,可以参考我的另外一个教程:

Buildroot详解

3.3.3. crosstool

http://kegel.com/crosstool/

现在用的最多的是那个0.43的版本:

crosstool-0.43.tar.gz

也可以去在线浏览对应的源码:在线浏览crosstool-0.43源码

3.3.4. Embedded Linux Development Kit (ELDK)

http://www.denx.de/wiki/DULG/ELDK

也是和交叉编译相关的。

提供编译好的东西供使用。

可以去这里:

http://www.denx.de/wiki/view/DULG/ELDKAvailability

去下载。

3.3.5. OpenEmbedded的BitBake

OpenEmbedded是一个创建嵌入式Linux的整套框架,其中包括了制作对应的交叉编译器的工具,叫做BitBake

OpenEmbedded简称OE。

OpenEmbedded主页:http://www.openembedded.org/wiki/Main_Page

OpenEmbedded的在线文档:OpenEmbedded User Manual

关于BitBake可去参考:

http://en.wikipedia.org/wiki/BitBake

中的:

http://developer.berlios.de/projects/bitbake

3.4. 使用已有的交叉编译器和自己手动编译交叉编译器之间的对比

后来在:

http://ymorin.is-a-geek.org/projects/crosstool

中发现作者ymorin之前的一些会议演讲:

http://crosstool-ng.org/publis/

等内容,比如:

200910-ELCE-Morin-Building_our_own_toolchains.pdf

其中,对于下载别人已有的交叉编译器和自己手动编译一个交叉编译器之间,做了些对比,分析了各自的优缺点。

个人觉得其说的比较全面,特此整理如下:

3.4.1. 使用已有交叉编译器的优点

  • 安装和使用都很方便

    别人发布的,已经编译好的交叉编译器,基本都是压缩包

    然后你解压后,即可得到对应的,可用的,交叉编译器

    其效果,类似于,之前自己编译出来的交叉编译器,有对应的交叉编译版本的gcc,ld等等程序,即:

    arm-xscale-linux-gnueabi-gcc

    arm-xscale-linux-gnueabi-ld

    等等文件的了。

    比如:

    【记录】Ubuntu下用crosstool-ng为xscale建立交叉编译器arm-xscale-linux-gnueabi-gcc

    中的:

    crifan@ubuntu:~/develop/crosstool-ng/crosstool-ng-1.18.0_build$ ls /home/crifan/develop/crosstool-ng/x-tools/arm-xscale-linux-gnueabi/bin -lh
    total 18M
    -r-xr-xr-x 1 crifan crifan 605K Aug  8 01:10 arm-xscale-linux-gnueabi-addr2line
    -r-xr-xr-x 2 crifan crifan 633K Aug  8 01:10 arm-xscale-linux-gnueabi-ar
    -r-xr-xr-x 2 crifan crifan 1.1M Aug  8 01:10 arm-xscale-linux-gnueabi-as
    -r-xr-xr-x 2 crifan crifan 276K Aug  8 01:10 arm-xscale-linux-gnueabi-c++
    lrwxrwxrwx 1 crifan crifan   28 Aug  8 00:54 arm-xscale-linux-gnueabi-cc -> arm-xscale-linux-gnueabi-gcc
    -r-xr-xr-x 1 crifan crifan 605K Aug  8 01:10 arm-xscale-linux-gnueabi-c++filt
    -r-xr-xr-x 1 crifan crifan 276K Aug  8 01:10 arm-xscale-linux-gnueabi-cpp
    -r-xr-xr-x 1 crifan crifan 3.1K Aug  7 23:57 arm-xscale-linux-gnueabi-ct-ng.config
    -r-xr-xr-x 1 crifan crifan  26K Aug  8 01:10 arm-xscale-linux-gnueabi-elfedit
    -r-xr-xr-x 2 crifan crifan 276K Aug  8 01:10 arm-xscale-linux-gnueabi-g++
    -r-xr-xr-x 2 crifan crifan 272K Aug  8 01:10 arm-xscale-linux-gnueabi-gcc
    -r-xr-xr-x 2 crifan crifan 272K Aug  8 01:10 arm-xscale-linux-gnueabi-gcc-4.6.0
    -r-xr-xr-x 1 crifan crifan  30K Aug  8 01:10 arm-xscale-linux-gnueabi-gcov
    -r-xr-xr-x 1 crifan crifan 2.7M Aug  8 01:10 arm-xscale-linux-gnueabi-gdb
    -r-xr-xr-x 1 crifan crifan 2.7M Aug  8 01:10 arm-xscale-linux-gnueabi-gdbtui
    -r-xr-xr-x 1 crifan crifan 670K Aug  8 01:10 arm-xscale-linux-gnueabi-gprof
    -r-xr-xr-x 4 crifan crifan 1.1M Aug  8 01:10 arm-xscale-linux-gnueabi-ld
    -r-xr-xr-x 4 crifan crifan 1.1M Aug  8 01:10 arm-xscale-linux-gnueabi-ld.bfd
    -r-xr-xr-x 1 crifan crifan  11K Aug  8 01:10 arm-xscale-linux-gnueabi-ldd
    -r-xr-xr-x 2 crifan crifan 617K Aug  8 01:10 arm-xscale-linux-gnueabi-nm
    -r-xr-xr-x 2 crifan crifan 775K Aug  8 01:10 arm-xscale-linux-gnueabi-objcopy
    -r-xr-xr-x 2 crifan crifan 943K Aug  8 01:10 arm-xscale-linux-gnueabi-objdump
    -r-xr-xr-x 1 crifan crifan  11K Aug  8 01:10 arm-xscale-linux-gnueabi-populate
    -r-xr-xr-x 2 crifan crifan 633K Aug  8 01:10 arm-xscale-linux-gnueabi-ranlib
    -r-xr-xr-x 1 crifan crifan 317K Aug  8 01:10 arm-xscale-linux-gnueabi-readelf
    -r-xr-xr-x 1 crifan crifan 609K Aug  8 01:10 arm-xscale-linux-gnueabi-size
    -r-xr-xr-x 1 crifan crifan 605K Aug  8 01:10 arm-xscale-linux-gnueabi-strings
    -r-xr-xr-x 2 crifan crifan 775K Aug  8 01:10 arm-xscale-linux-gnueabi-strip
    crifan@ubuntu:~/develop/crosstool-ng/crosstool-ng-1.18.0_build$
    
                    

    然后,你把包含了上述arm-xscale-linux-gnueabi-gcc等文件的路径,加到环境变量PATH中,然后就可以使用了。

     

  • 已验证和测试

    别人发布的,交叉编译器,一般都是,经过相应的验证和测试

    保证了,可以使用,不会出问题的。

    所以,你可以放心使用,不会担心,出现编译程序出错的时候,确保不会是由于交叉编译器问题。

  • 已优化

    别人发布的交叉编译器,一般都是经过,在制作的时候,加了一些优化参数

    使得针对某些方面,比如性能等等,做了相应的优化

    使得,交叉编译器编译出来的程序,对于目标的CPU,是相对最优的

     

  • (售后)支持比较好

    就像你买东西,很多时候,不出问题的时候,售后,看不出有啥用

    但是当出问题,就发现,售后其实很重要

    而搞嵌入式开发,尤其是交叉编译

    很多时候,涉及到很多技术细节

    有时候遇到问题的话,如果你不熟悉,不了解,不会解决

    这时候,去找到,交叉编译器的提供者,去咨询

    对于你来说,就显得很有价值,很重要了。

    别人提供的交叉编译器的话,往往都是提供后续的技术支持的

    对于多数的开发者,这点,还是有价值的

3.4.1.1. 已有的交叉工具链的下载

参考:http://www.cnblogs.com/esion/archive/2012/08/28/2660033.html,其实是可以安装后,设置好环境变量,之后就可以一直不变的去使用的。

 

http://www.myir-tech.com/download.asp中提供了很多东西下载,包括工具链。

 

3.4.1.1.1. ELDK的下载

http://www.denx.de/en/News/WebHome

-> ftp://ftp.denx.de/pub/eldk/5.3/

-> ftp://ftp.denx.de/pub/eldk/5.3/iso/

中有各种的,基于arm的eldk,比如:

  • eldk-5.3-armv4t.iso
  • eldk-5.3-armv5te.iso
  • eldk-5.3-armv6.iso
  • eldk-5.3-armv6.iso
  • eldk-5.3-armv7a-hf.iso
  • eldk-5.3-armv7a.iso

貌似是下载下来,解压后,去运行安装脚本后,就可以使用了。

 

3.4.2. 使用已有交叉编译器的缺点

  • 无针对你自己的CPU的优化

    别人提供的,已有的交叉编译器,相对来说,更多时候,都是针对某个系列的CPU,进行制作出来的,进行优化的

    即,其优化,也是相对比较通用的

    如果你的CPU和其不同,则其就没有对应的优化了

     

  • 专有化

    和上面有点类似,即没有针对你自己的CPU,进行优化

     

  • 太老,太旧

    别人给的,网上可以下载到的,很多交叉编译器,相对来说,版本都比较旧了,都是很老的,之前的了

    其所用的,其他各个组件,模块,也都是旧版本的

    旧的软件,对于新出来的CPU,新的功能等,自然没有对应的支持

    也就无法发挥新的硬件特性了了

     

  • 其所用的源码不清楚

    别人给你编译好的交叉编译器,你是可以用了

    但是,其针对于具体什么版本的源码,以及是否打了相应补丁等情况

    你是无法,也很难知道的

    所以,即无法掌控此已有交叉编译器的所用的源码的确切情况

    此点,针对于你对自己的CPU很熟悉的情况下,想要完全了解已有交叉编译器的背后的情况而言,算是个缺点

    即不能完全在你掌握范围内,不清楚后面的情况

  • 未必适合你的系统

    或许是不可重载(relocatable)的

    没有很方便的方式去获得一些系统库文件

    所以,未必真正适合你自己的,嵌入式系统环境

 

3.4.3. 自己手动编译交叉编译器的优点

  • 自定义各种组件及版本

    对于自己去制作交叉编译器的话,则其所用的各种组件,模块的版本,都可以自己选择和定制

     

     

  • 针对你自己的CPU进行特定的优化

     

     

     

  • 对于各种补丁包,已经很清楚了

    既然是自己制作交叉编译器,那么自然选择了,相对较新的源码包,以及各种模块

    其自然,已经现存有很多补丁包

    这些补丁包,修复了很多bug,或者是增加了很多新的功能支持等

    这时候,你就可以找到并打上这些补丁包

    以实现,修复该模块的已知的bug,增加新的功能的支持了

     

  • Same source for all targets

    暂未搞懂此点的确切含义。

     

     

  • 可以同步更新最新补丁

    相应的,如果有最新的补丁,也可以及时打上

     

  • 可重复

    对于自己制作交叉编译器的话,

    制作完成后,就确定了对应的各个模块的版本,有了对应的配置文件

    此配置,拿到别的地方,别人用同样的工具和类似的环境,是可以重新编译为其自己的

    即,所谓的可重复,别人可以利用你已经验证,可以正常制作和使用的各个版本的模块和配置,实现自己也制作一个属于自己的交叉编译器

     

  • 有社区支持

    当然,对应的,在制作交叉编译器期间,使用交叉编译器期间,

    出了问题,有任何疑问,都有对应的社区的,热心人,帮你解决,回答你的问题。

     

  • 适合你自己的系统

    如前所述,拿别人已制作好的交叉编译器,未必真正完全适合你自己的系统

    而如果你自己制作的话,当然就完全根据自己的需求,去制作出最适合自己的系统的交叉编译器了

     

 

3.4.4. 自己手动编译交叉编译器的缺点

  • 制作交叉编译器相对比较复杂

    制作交叉编译器,相对来说,是个技术活加体力活

    不仅仅要求有对应的知识背景,解决各种问题的能力,

    还要准备一定的时间和精力,去真正实现,真正去建立出来一个可用的交叉编译器

     

  • 可能存在的,对于你的处理器支持度不是足够好

    既然制作交叉编译器期间,可能需要打上很多的patch等等

    那也就存在,比如缺少了对应的补丁,补丁不太完整,补丁不合适等等特殊情况

    使得,对于对应的,有些处理器,支持度,不是很好

  • 验证

    在制作出了交叉编译器后,其实还需要一定的验证,保证其可用,好用。

    这也需要对应的技术能力,和精力,去实现。

     

  • 社区的支持

    对于社区的支持,有其之前所说的优点,那就是,社区活跃的话,可能解决问题的效率就相对较高

    但是当社区不够活跃,社区中没有合适的人,那么可能你的问题,就很难得到解决

    即,有问题的时候,依靠社区去解决,未必是完全靠谱的。

 

第 4 章 交叉编译心得和注意事项

摘要

4.1. 交叉编译心得和注意事项

待整理:

相关旧帖:【整理】交叉编译心得和注意事项