[注:本文仅适用于嵌入式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就招架不住了。
终极方法
终极的交叉编译方法就是不交叉编译。
在你的目标平台上安装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分钟左右。
除了速度比较慢以外,这是个终极解决方案,可以解决所有的交叉编译烦恼
Enjoy it :-)
分享到:
相关推荐
zynq相关交叉编译&uboot;&kernel;&rootfs;&驱动&jffs2;编译等一篮子解决方案
Cmake交叉编译环境配置文档 1、设置交叉编译之前,必须在CMakeList.txt前面加上这样一句,这样CMake才会认为你是要交叉编译: SET(CMAKE_SYSTEM_NAME Linux) 其中Linux是要编译过去的平台,如果你是在Linux下交叉...
rk交叉编译工具
ARM64下QT需要用到QWebEngine模块,网上很多资源交叉编译QT时,均默认跳过此步骤,没跳过此步骤的很多未能详细提供交叉编译webengine模块所依赖的库,导致此模块无法交叉编译通过,资源中包含了arm64下交叉编译的...
飞腾交叉编译环境搭建之交叉编译工具链配置
文档包含完整的例子,交叉编译还提供了下载链接,保证有用,不成功可留言 centos7下进行aarch64(arm64)交叉编译工具安装 iperf3交叉编译并在Android下运行 iperf3带宽TCP、UDP性能测试 怎么5分变6分了,不...
libwebscokets的交叉编译,从cmake开始实际操作可行。
交叉编译环境完全通 当我们开发嵌入式Linux软件时,一般都要经过交叉编译这一步。如果是开发PC机上的软件,我们只要用Linux本身提供的强大的编译器(如gcc)直接编译就可以了。而一般的嵌入式设备所用的CPU和PC机上...
encfs 交叉编译 encfs 交叉编译 encfs 交叉编译 encfs 交叉编译 encfs 交叉编译
arm平台下使用ndk工具交叉编译python,用于android系统;android-arm平台ndk交叉编译python
海思v400交叉编译工具 海思v400交叉编译工具 海思v400交叉编译工具
用于学习如何移植linux的入门文档用于学习如何移植linux的入门文档
mqtt跨平台arm交叉编译,MQinstall是mqtt安装路径,arminstall是openssl的库包,makefile已经移植好的,如果交叉编译环境搭建好,直接make就可以了
ARM平台的ppp-2.4.4交叉编译 ARM平台的ppp-2.4.4交叉编译 Phenix 2007.04.30 交叉编译器 : arm-linux-gcc 3.3.2 ppp版本 : both 2.4.4 and 2.4.3 are OK
菜鸟学习ARM——安装交叉编译链记录,及编译jpeg
该SDK适用于树莓派设备,其中的openssl和paho.mqtt.c的动态库是在Ubuntu上交叉编译过的,其中的MQTTClient_publish.c是一个发布程序,MQTTClient_subscribe.c是订阅程序。 使用方法:我们只需要在ubuntu上安装好...
在网络上搜索到的交叉编译指令,大多有错误并且通常难以解决。本文档综合了许多,详细系统的给出了SDL2及其扩展库的交叉编译方法。(本文档由于在linux环境下写成,所以打开时,可能会出现汉字乱码,但指令一定不会...
MiniGUI交叉编译 更多资源请访问http://www.59186618.com
交叉编译是嵌入式开发过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成,一般把前者称为目标机,后者称为主机。采用交叉编译的主要原因在于,一般嵌入式...
压缩包内部包含7个软件:libdnet snort daq pcap pcre zlib openssl,每个交叉编译的步骤。文档只是记录自己编译的过程,基本编译按照模式来不会出问题,依赖库需要自己移到开发板上。可自行考虑连接静态库