亂想亂寫之閑話編譯
從畢業到現在,我已經編譯過很多系統了。其中大部分為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。