乱想乱写之闲话编译
从毕业到现在,我已经编译过很多系统了。其中大部分为C++程序,部分为JAVA程序,还有一些网站的程序sample,另外还有些插件程序。当然,说是编译其实并不全面,编译是对C++来说的,其他可能还有部署啊啥的。
现在的时代已经不是重复制造轮子的时代,而是怎么利用轮子的时代,闭上眼睛,你可以听到open source的呼唤,噢,当然,如果你是开发商业应用的话,请注意许可证污染问题,最好是使用apache和BSD的liscense的程序。不过我们现在讨论的是编译问题,而不是之后的如何使用的问题。
首先,还是说说熟悉的C++吧。大家都知道,C++不是平台无关的,也就是说,对于这个平台,我们要写一套C++代码;而对于另外一个平台,我们则基本上要写另外一套C++代码。除非你写的程序是和标准库相关的,否则跳不出这个圈子。这也是为什么JAVA一推出就大受欢迎的原因之一。
而C++开发者们为了让自己的程序可以在不同的平台上面,都可以编译出平台适合的程序出来而不必大量修改代码,做了非常多的工作(当然,对于我们这些下载他们代码进行编译的同学们来说,也带来了很多麻烦)。到现在为止,我下载编译的C++程序应该有几十个,当然,有些编译通过了,有些编译有问题,有些则。。。
在这些程序中,一些是为了linux平台编写的,然后移植到windows平台下,这些程序是比较难搞的,在我来说,基本算是最难搞的。
有些程序尽管是windows平台下的,但是只有C++文件和makefile文件,而不是我们熟悉的有一个C++的工程文件,这些程序也比较困难。
下面就是有C++的工程文件的,但是现在VC的版本升级很多,有的是VC6的,有的是VC2003的,VC2005的,甚至有些居然是VC2008的,不要搞多久,估计会有2010的了。这里就又有版本的兼容性问题出来了。
同时,由于大家也共用轮子,所以某些开源项目还使用了其他项目的代码,但是,一般来说,在下载的时候,该项目仅仅是提供自己的代码,而不提供其他项目的代码,这样,你就需要去一个个的找其他的依赖项目,同时,这些项目也在不断的升级,所以并不一定你下载最新的代码能适合使用,而需要某个特定版本的代码才可以。
接着就是编译成静态库还是动态库的问题,然后还有字符集的问题,现在一般是使用unicode的字符集,但是很多的国外开源项目使用的是multibyte的,同时,还要注意MFC是否使用了,否则一个不使用MFC,一个使用,好像又会有冲突。最后,就是多线程,两个版本如果使用不同,也会出现问题。
在解决这些问题的过程中,你会不断遇到各种编译错误,最后会遇到链接错误,而直到现在还报得让人很郁闷无语的模板使用错误就更不用说了。
当然,你并不是孤独的,当你在google中输入link2001,link2005的时候,你会得到成千上万的结果,而在你所编译软件的论坛或者邮件列表中,你也会看到其他和你遇到同样问题的人。
程序员何苦为难程序员?
尽管很感谢那些辛苦写出代码,并且不要求回报,直接将其开源的同志们,不过看到这样的结果,还是忍不住要听几句HOTDOG的歌来发泄一下。
下面就列出一些我编译过的项目,来共享一些经验:
1. Notepad++
台湾人写的,所以对中文支持比较好,基于scite的内核,很多人喜欢用它是因为它的界面以及支持代码折叠,同时有线条来将代码进行对齐。
由于该软件只支持windows平台,还是挺好编译的,大家可以在其官网上面下载到源码,然后编译一个试试看。
2. Filezilla
作为最老牌的开源FTP客户端,filezilla也是一个很棒的项目,但是,离开学校后,使用FTP的机会是越来越少了,所以编译完之后,基本就没有使用的机会,但是通过这个项目来学习界面控件,真是一个好的例子,它的界面控件十分丰富。
如果有同学使用FTP的话,可以以其为基础来做一些相应的修改。
这个不清楚是否支持其他平台,但是当时我下载的是VC版本的,编译也不算很困难。
3. Akelpad
俄国人写的用来代替notepad的程序,完全win32API编写,共有1万多行代码,支持插件功能,察看其代码,是基于richedit控件进行扩展的。
如果有同学希望学习一下windows API的使用,windows消息机制等相关的知识,这是一个好的参考项目。
编译很容易,需要注意的是Akelpad3和Akelpad4有了比较大的修改,同时开发者似乎也不同了,建议阅读源码的时候最好从Aklepad3开始比较容易入手。
4. UltraVNC
VNC程序,有客户端和服务器,服务器似乎叫winvnc,编译很容易。
经过实际使用,速度很好,能支持远距离控制和传输,缺点是分辨率支持不够,不能够像windows XP的远程桌面那样全屏,如果对方桌面分辨率比较高的话,需要左右上下移动滚动条才能看全,很不方便。
另外就是只能支持公网IP,这是大部分远程桌面程序的弱点,并不能像QQ的远程桌面那样支持内网IP。
如果同学要研究图像的远程传输等功能或者直接想研究VNC的协议等,可以研究一下其代码,当然,如果要研究VNC的协议,还可以通过监听网络来实现,这个就不说了。
5. eMule的VeryCD版
现在在国内,大部分人包括我还是使用的这个版本。当然,其实还是有很多其他版本在流传的,包括开源的和不开源的。还有传说中的天使驴和恶魔驴等等。
这个编译就不是非常容易,首先你下载下来的代码是不完全的,它有好几个依赖库需要一个个去下载,然后各自编译,最后组成一个程序。
如果需要研究P2P共享网络,或者文件共享啊什么的,研究这个程序会有帮助,反正我只是将其编译出来,用这个下载东西,还发现里面有几个txt文件的小秘密,这里就不说了,大家有兴趣自己来玩一下就知道是什么了。
6. Firefox
这个我就不推荐大家编译了,作为现在最有名的浏览器软件,支持多个平台,其代码编译也是极其麻烦的,反正我似乎记得我是半途而废了。
其有力的竞争对手,同样出于名门的chrome,大家感兴趣也可以试试。
firefox的插件机制,现在被大家都在模仿,有兴趣可以了解了解。
还有就是javascript引擎。
想看的同学就去看看好了。RTFC才是进步的源泉嘛。
7. AutoHotKey
如果大家读过善用佳软兄或者小众软件的相关文章,相信对AHK就不会太陌生,现在AutoHotKey和AutoIt两个似乎都是开源(如果有误请纠正我),编译比较简单。而且这两个项目似乎本来是从一个项目发展分支的。
如果大家对于开发简单的脚本解释程序感兴趣,可以看看其源码,我感觉对于宏开发比较有帮助。
当然,其本身作为一个工具软件,也是有很多用途的,现在很多公司尝试使用AHK来辅助进行自动测试脚本的开发,但是由于其并不是商业软件,很多功能并不是太理想,所以现在并没有很普及,像QTP或者TestComplete作为商业软件,在一定的时间内还是有其优势的,而同时AHK本身开发出来也并不是为了自动化测试的目的而进行开发的。
8. lumaQQ
国产精品,大家鼓掌~~~
这个就不用说什么了,著名的“如来神掌”。不过作为技术人员,不能那么“浅薄”。我们对其研究,可以看到很多其他技术的闪光点。至少luma的查IP那几篇文章写得真是好啊真是好。项目是JAVA的,具体有没有编译过,我自己都记不清楚了,不过至少是下载过源码,看过一些些的。
9. pymsn
这个大家大概不是很熟悉。是用python写的MSN客户端程序。提到这个就有个小插曲,同时也说明俺真是个容易半途而废的家伙,-_-||。
当时想自己开发一个MSN的客户端程序,不过MSN那时最新的版本已经是live messenger了,同时已经是使用SOAP并使用SSL进行加密传输了。由于是加密传输,所以使用网络监听工具来分析协议至少对于我来说是变成不可能的任务了,因为显示的都是密文,尽管我应该是有公钥可以解的,但是还是不知道如何去做。找了很多分析的工具,似乎都用不了。
那自己分析不了,就看看有没有其他人分析的成果可以使用了。在网络上搜索,发现最新版本的live messanger使用的MSN协议msn15似乎还没有人有分析的文章出来,以前版本的协议是有相关的文章的,不过当时就希望搞就搞最新的协议,不搞老版本的了。其实当时的MSN服务器还是支持MSN8什么的的。
找来找去,不管是有名的aMSN还是啥pidgin,都没有支持最新版的协议,这时pymsn横空出世,在其测试branch中,出现了一个支持最新版本协议的。于是将其下载下来进行了一下研究,还学习了几个小时的python,将其运行起来进行分析,结果不太幸运,卡在某个地方了(具体记不太清楚了,似乎也是在某个认证的地方),所以项目就夭折了,不过pymsn这种精神还是可嘉的。大家有兴趣可以看看,MSN的认证机制也很有意思,基本已经是分布式的了,并不是一步认证的,而是分为好几步,很多服务器协同来完成。
10. eclipse
最近正在学习JAVA,没办法,JAVA的项目还是比C++要多啊,用的IDE就是eclipse,不过貌似也没有多少人用JAVA但是IDE不是使用eclipse的了吧,有免费的不用干嘛呢。
尽管没有看过eclipse的源码(真的是没有时间和精力,而且JAVA的功底也比较浅),但是蓝色巨人还是品质的保证,用重金加上良好的基础(VisualAge也贡献了一部分的),还有专家们的参与,这个项目不好也难(其实我这里说大话了,大家可以用人件或者Dream in Code来反驳我,不过sun确实被eclipse掉了,至少对于这个项目来说,还是挺成功的)。
对于开发JAVA的界面程序,eclipse就是一个宝库。同时在设计模式等方面,其中的巧思妙想也是值得学习的。
而且也使用了插件机制(有没有发现大家都走了同样的道路呢?呵呵),仅仅使用一个微内核来完成最核心的功能和进行管理协调,其他都是使用插件形式来完成。
当然,这里最大的问题就是内存,不过现在内存这么便宜,而且企业都用,管他那么多呢。
以前跟着微软走,现在就跟着IBM它老人家混混吧。:)
11. JDK
JDK开源大家肯定都知道了,作为要了解最深层的东西,我又要说宝库这两个字了。util包中的东西就够翻了,然后再看看编译器的实现,JVM的实现,哦,真是乐不思蜀了。此处是何乡?梦里不知身是客,一晌贪欢呀。。。
要了解编译器相关的,还可以去看python。
自己做一个语言出来,还是蛮酷的,国内不是有个易语言嘛,大家也可以做个什么以自己命名的语言出来的。
还有一些服务器的项目,并没有去测试,本身也就一台机器,而且也装卸了很多软件,环境已经很“恶劣”了,就不去搞有的没的了。
至少apache是开源的,RED5是开源的,mysql并不清楚是否开源,至少是免费的,还有很多开源的游戏引擎,包括2D的和3D的,以及模拟魔兽服务器的那个开源项目(似乎有些魔兽的私服就是用的它),好像看过一个兄弟的文章,用模板非常多,编译一下就要几个小时,我对模板很感冒,同时机器也差,就不去凑这个热闹了。
对于服务器,首先,这个是高端,是潮流,不管精通了其中的哪个,都是牛人,这里我没有研究过,而且本身不做这个,也就不废话什么了,反正题目是闲话,随便说说的。只能说,想深入网络编程的,想对操作系统了解深入的,想了解协议是怎么实现的,线程池是怎么实现的,进程是怎么交互的,来看看这些吧。
只要你愿意,在开源界现在基本能找到你需要的所有软件的实现,这也是我国专家说,我们的软件实力已经接近世界水平的底气所在了(oh, come on...)。从上到下,从操作系统到应用系统,包罗万象,但是,有实现并不代表实现得好,有开源的实现那为什么商业的产品还有人用,还卖得那么好呢?
不过从技术的方面来说,商业产品有的,开源的实现也有,只不过在界面,在功能的全面性上,商业化产品更好一些,当然要好一些,不然大家就都用免费的了。(其实free在这里的意思并不是免费,开源也并不全代表免费,但是一般来说,比闭源的商业产品要便宜或者干脆就是免费的)
作为程序员,也就是从开源中学到一些东西吧,比如有些产品没有思路,可以看看人家是怎么实现的。还有些开源产品,是人家程序员吃饱喝足,没事做做出来的,一般这样的程序员都是比较厉害的,可以看看这些牛人是怎么写程序的,比如现在java里面一些开源框架就给大家很多启发。
其他的一些源码啊什么,现在也记不太清楚了,比如还可以看看linux源码啊,什么spring,struts啊,反正太多了,也就不一一列出来了,而且这些应该网上是大把大把的文章,都可以找到。
最后列出两个网站:
1. sourceforge 全球最大的开源项目站点,不过现在googlecode也开始赶上来了,但是老牌的开源项目还是SourceForge上面比较多。
2. codeproject 这个主要是微软的一些VC以及C#的项目,比较的小,但是作为参考不错。还有类似的网站codeGURU,不过常上的还是codeproject。