龙行天下
continuex
全部博文(199)
uboo源码解析(2)
读书(2)
linux下的音乐播(5)
拨号上网(5)
arm指令及伪指令(1)
日志(5)
系统的启动时间(3)
系统崩溃的原因(3)
硬件部分(1)
案例(1)
watchdog deamon(5)
理论性(8)
交叉编译工具(3)
bootloader(3)
内核的配置 编译(5)
根文件系统相关(1)
SHELL(2)
软件的安装相关(1)
串口通讯(2)
进程间通信(1)
多线程编程(2)
人物(2)
数据结构(1)
基本概念(0)
创业板块(2)
应用软件的安装(5)
运放(1)
电磁兼容(1)
容阻感三兄弟(7)
封装技术(2)
2010年(199)
好学力行
Alex_Liu
Bsolar
浪花小雨
mudoo_1
a8474285
Aniu12
18806130
sharpton
分类: LINUX
2010-07-01 17:54:56
linux下开源软件的种类和数量多的数不过来,这是一笔很大的资源,从某种意义上来讲我们应该好好的利用这些资源。让它在不同的硬件软件平台上大放异彩。因此很多人想到了软件移植这个方法。 软件的移植可以分很多种类,比如32位到64位,linux 到windows,i386到arm等等,这里只介绍不同硬件平台之间的软件移植常用方法和步骤。 不同硬件平台之间移植软件一般要用到交叉编译工具,这是在嵌入式系统开发中常用的方法。所谓的交叉编译就是在一种平台上运行的编译器能够编译产生在另一种平台上运行的二进制程序。就像现在的克隆技术允许利用牛的子宫来生羊一样。哈哈,不太贴切哦 一般交叉编译工具是由硬件生产商以压缩包的形式提供的。不同的交叉编译工具的安装方法可能有所不同,在压缩包里都有说明。通常包括的步骤是:1 解开压缩包2 根据压缩包里的README修改PATH环境变量(在~/.bash_profile或者~/.bashrc里添加"export PATH=xxxxxxxxx")3 修改LD_LIBRARY_PATH 环境变量好了,我们的交叉编译环境建好了。接下里就是编译软件了。在这里说明一下,由于不同的软件的复杂程度不同,移植起来的困难程度也不同。有些软件在开发的时候就已经考虑到了它的可移植性,比如busybox,而大部分软件并没考虑。 在拿到要移植软件的源码包之后。我们首先要对软件的功能和实现方法有一个基本的了解。并分析软件的依赖关系,(1)硬件相关,比如原代码里面可能嵌入一些汇编指令;(2)它依赖什么特定的函数库,比如glibc;(3)是否依赖特定的高层图形类库,比如gtk;(4)依赖特定的软件,比如GUI程序依赖的X server。 另外,软件运行条件的分析,这个是移植必须要做的。比如内存的需求,CPU的能力的需求,占用磁盘空间的需求等等。如果有不可能达到的要求则放弃软件的移植。 移植一些简单的系统命令和移植性比较好(指的是除了交叉编译工具包提供的库之外不依赖其他的库,或者自己生成库)的软件是很简单的事情,只需要指定要用到的编译工具为上文中安装的编译工具即可。在有的软件中显式的让你选择编译工具。比如在busybox配置菜单中有让你选择编译器的选项。如果软件使用GNU autoconf工具生成Makefile 的话你可以选择在执行configure命令时利用参数指定编译器,如: ./configure CC=xxx-linux-gcc CPP=xxx-linux-g++也可以直接修改configure 生成的Makefile 不过这是一个笨方法。因为源码可能有很多子目录,每个子目录都含有一个Makefile,这样你必须修改所有的Makefile 中的指定编译工具的语句。都指定它们使用交叉编译工具。有些手写Makefile 的软件也只能手动修改Makefile了。 稍微困难一点的,软件依赖很多其他函数库。比如gtk软件必须要有gtk库的支持,为了软件的编译和运行,你必须首先将这些函数库移植过来。令人崩溃的是这些函数库可能还依赖别的函数库........。没办法,要么放弃这部分代码要么只能把所有直接或间接依赖的函数库一一移植过来。在移植这些库的时候别忘了也把它的头文件弄过来啊(这个不用交叉编译:))。另外如果是GUI软件。可能还要依赖X,如果没有给你提供目标平台上的X,你还要把X移植过去。这可是比较困难的一个工作。建议一般人不要试。基本上这种困难程度的软件移植要求你要注意编译时的出错信息,通过你对c/c++程序的生成过程的步骤和语言的掌握情况对症下药。尽量满足编译需要的条件。 更困难的是需要修改源代码,假如源码里有很多硬件相关的代码,比如汇编指令,不同体系结构的指令集不同,如果你有足够的势力那你就把这些汇编用目标平台的汇编指令代替。可能不仅仅是一条条指令对应那么简单啊,因为目标平台可能没有对应功能的指令并且在不同平台上软件运行到汇编代码处时各个寄存器的意义不相同。另一个方法是如果可以用C代码将汇编段的功能模拟出来,那就用c代码代替汇编代码。这两种方法都需要你要有足够的c/c++功底来阅读源代码并且有深度的理解。如果实在没有办法解决可以考虑放弃此段代码。前提是这段代码的功能不是必须的。
在移植一个软件的时会遇到到各种各样的问题。这是对你掌握知识面的考验。以上只是解决问题的基本思想。如有错误敬请指明。
转载请著名来源
nnnqpnnn
转自:http://www.cublog.cn/u/18687/showart_159911.html
上一篇:一个watchdog deamon的实例
下一篇:shell脚本中一些特殊符号
登录 注册