欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

交叉编译完全解决方案 博客分类: 技术 DebianMaemo嵌入式Linux虚拟机

程序员文章站 2024-02-26 15:01:52
...

[注:本文仅适用于嵌入式Linux系统]


背景

 

嵌入式系统开发的头疼问题之一就是交叉编译。

 

什么是交叉编译?简单的说,就是程序的目标运行平台与编译这个程序所在的平台不一样,这样的编译方法就是交叉编译。在交叉编译一个软件包的时候,要适当的配置build, host和target参数。

 

什么是build, host和target ?

 

build:  就是你进行编译的平台,也就是运行交叉编译器的平台。这个一般不用指定,configure脚本会自动检测。

host:  就是你的交叉编译器所使用的库的目标平台。一般情况下,这个就是你的目标程序的运行环境。

target: 就是你的目标程序的运行平台。

 

绝大多数情况下,host和target是一致的。很多时候只需要配置host即可,configure会根据你的host来推测target。

 

基本方法

 

了解交叉编译的基本知识以后,就可以用基本方法来进行交叉编译。关于交叉编译的基本方法,见:嵌入式Linux下常用的交叉编译方法

 

虚拟方法

 

虚拟方法是指利用qemu这样的虚拟工具来部分模拟目标环境,配合交叉编译器来进行交叉编译。目前只有scratchbox是使用这样的技术。

 

随着maemo的热度上升,scratchbox也得以迅速发展,sb1相当稳定,sb2也已经非常可用了。

 

利用虚拟机来仿真运行可以解决大部分的在交叉编译过程中遇到的问题,但是还是会遇到问题。例如有些库在编译过程中通过/proc/cpuinfo检测CPU所支持的指令以进行特别优化,或者碰到sb2没有截获的路径映射,就会连接到错误的库,还有qemu-arm的透明仿真模式容易陷入死循环。例如,在sb2中编译ruby1.9.1就会陷入死循环而编译不过。碰到一些更复杂的,如编译ruby的c扩展,安装需要及时编译的gem,这个时候scratchbox就招架不住了。

 

 

终极方法

 

终极的交叉编译方法就是不交叉编译。交叉编译完全解决方案
            
    
    博客分类: 技术 DebianMaemo嵌入式Linux虚拟机

 

在你的目标平台上安装debian,然后就可以进行本地编译。

 

在arm平台上安装debian请看:http://wiki.debian.org/ArmEabiHowto

 

最新的lenny已经采用了eabi,效率提升并且允许混合使用软/硬浮点库,对于算法类型的应用真是福音!

 

要安装lenny debian-eabi大约需要160M的存储空间。

 

要是你的平台没有这么大的存储空间也没关系,用nfs就可以了。

 

要是连网络连接也不具备怎么办? 如果是这样,那就只好又借助qemu了。可以在qemu中安装debian,进行编译,最后把编译后的目标文件拷贝出来就可以了。不过这样你需要看一下你的平台qemu是否支持,以及你要提供一个于你平台最接近的内核。

 

在目标平台上直接进行本地编译,在速度上比较慢,而且有些文件的编译需要耗费很多内存,例如ruby1.9的parser.c文件在64M内存的平台上就无法编译。这个时候就需要打开swap才行。

 

 

一个参考数据: ARM9 (v5TEJ), 98BogoMIPS,64M RAM, 编译ruby1.8.7 需要110分钟左右。

 

除了速度比较慢以外,这是个终极解决方案,可以解决所有的交叉编译烦恼 交叉编译完全解决方案
            
    
    博客分类: 技术 DebianMaemo嵌入式Linux虚拟机

 

Enjoy it  :-)