新闻  |   论坛  |   博客  |   在线研讨会
Complie通用Linux software心得
xinjinlong | 2013-01-18 14:23:34    阅读:2485   发布文章

最近比较忙,主要就是把windows的东西完全porting的Linux下,而且尽量支持多的Linux发行版,最好全部,去掉不说Windows下调用了Win32的library,没有办法,只有自己write code外,简单说一下让Linux下的software support Linux大多数发行版的过程,以VNC为例子,我当时选择的是x11vnc,我主要是用vnc server程序,当时操作的步骤有一下几点:
1、download x11vnc的source code, version 为0.9.12,貌似The newest is 0.9.13
2、选择宿主OS,我当时要求要support RedHat/CentOS系类、SUSE Linux系类、Ubuntu系列,前提只研究在kernel version > 2.6,再低就不玩,想着中情况,肯定要选择kernel版本最低,这些发行版中,我只有选择RedHat5.4,但是还要看libc可以支持的最低版本,RedHat5.4 Kernel version:2.6.18,这些发行版中最新的就是Ubuntu12.04(当时),恰好libc可以支持RedHat5.4,这样就可以肯定开发宿主OS为redHat5.4了
3、如果要x11vnc库running在尽可能多的Linux发行版上,不用说肯定要把x1vvnc编译为static,步骤肯定按照默认的编译方法,得到的x11vnc必然是依赖好多.so档案,可以使用ldd查看到底依赖哪些,但是个人发现,ldd也不是肯准确,但是可靠度还可以,找出依赖.so对应的.a档案,修改Makefile,理论上是可以编译通过,但是这个依赖是有递归的关系,Makefile的组织方式就不用多说,最常用的望后边放,找出每个.so档案依赖的文件后,就可以编译可以了,当然size肯定也很大,你可以strip一下,还是很不错
4、就在其他发行版上验证你编译出来的是不是都可以running,这个的确很耗时间,每个发行版还有不少的版本,这个就没有办法,只有一个一个验证
5、最头疼就是,理论上低版本上编译过可以在高版本上running,但是发现,还不一定,我在RedHat5.4上编译过,结果发现在Redhat6.2还是无法running,反而在Redhat6.2上编译可以在5.4上running,这个可以理解,6.2上libc是support5.2的kernel,但是在6.2上编译的在SUSE11 Linux是无法runnning,SUSE11的kernel的版本是2.6.19,针对x11vnc的情况是在X11 library,x11 library依赖的一些键盘操作的一些library,这一款差异比较多,当然中间也编译过glibc,这就不多说了,主要为x11vnc编译服务
总之,如果要get到一款support所以linux发型版的software,大致思路就是这些,也不一定要找一个最老的版本,找中间的可以兼顾最新&最老的发行版,编程为static是肯定的道路,但是有时间完全static比较困难是,可以减少对.so的依赖,这是一个很不错的方法

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
五湖四海皆朋友
最近文章
浅谈MIPS的MMU(二)
2016-08-16 19:33:41
浅谈MIPS的MMU(一)
2016-05-05 10:55:06
推荐文章
最近访客