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等等

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

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

  • 验证

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

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

  • 社区的支持

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

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

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