概述 就C++開發(fā)工具而言,,與Windows下微軟(VC, VS2005等)一統(tǒng)天下相比,,Linux/Unix下C++開發(fā),,可謂五花八門,各式各樣,。Emacs, vi, eclipse, anjuta,,kdevelop等層出不窮。 Windows下,,開發(fā)工具多以集成開發(fā)環(huán)境IDE的形式展現(xiàn)給最終用戶,。例如,VS2005集成了編輯器,,宏匯編ml,,C /C++編譯器cl,資源編譯器rc,,調(diào)試器,,文檔生成工具, nmake。它們以集成方式提供給最終用戶,,對于初學者而言十分方便,。但是,,這種商業(yè)模式,直接導致用戶可定制性差,,不利于自動化,,集成第三方工具的能力弱。例如,,無法定制一些宏來處理一些重復操作,;體會不到自動化makefile一步到位快感;無法遠程登錄到服務器上進行開發(fā),;無法使用某種”粘合劑”來把第三方工具(例如,,文本工具,字符串工具)有效地調(diào)用起來,??梢哉f,良好的商業(yè)支持和傻瓜式開發(fā),,是它們主要的優(yōu)點,。 在linux下,開發(fā)工具被切割成一個個獨立的小工具,。各自處理不同的問題,。例如,編輯器(emacs, vim)用來進行編輯程序的,,調(diào)試器(gdb)用來調(diào)試程序,,編譯器(GCC)用來編譯和鏈接程序的,性能分析工具(gcov, gprof)用來優(yōu)化程序的,,文檔生成器(doxygen)用來生成文檔的,。同時,還有一些系統(tǒng)工具和系統(tǒng)知識,,我們是很有必要了解的:程序自動化機制 makefile,,系統(tǒng)粘合劑shell,系統(tǒng)查找工具grep, locate, find,。其它的工具(例如ctags,, OCI公司的MPC等等),一旦熟練掌握,,它們將成為你手中的利器,。 本文主要是一些針對LINUX下開發(fā)工具使用的經(jīng)驗之談。由于,,工具品種繁多,,我們沒有能力也沒有必要一一介紹。對于LINUX下IDE工具,例如 eclipse, anjuta等,,它們雖然也很實用,,但是使用起來比較簡單,,而且目前還算不上主流,。所以,它們將不被著重介紹,。同時,,本文也不打算寫成各個工具的操作手冊,只著眼于介紹各個工具的想要解決的問題,、運行機理和主要特性,。 正文 編輯器 要進行開發(fā),第一件事情就是選擇一個合適的編輯器,。編輯器選擇有幾個要素: 1)減少不必要的編輯動作,,減少編輯的時間。 一切能夠無二義性描述出來的編輯任務,,都可以而且應該能被自動化,。例如,每一個C++程序都會有一個main函數(shù),;我們在定義.h文件時,,都希望加入一些預處理指令#define來幫我們解決重復引用同一個頭文件而帶來的麻煩。鼠標操作總是比鍵盤操作要慢的,。這方面EMACS做得可算是到了極致,。所以, EMACS用戶經(jīng)常會吹噓:他們編輯的速度等同于他們思考的速度,。 2)可擴展性高,。 程序員預期的編輯器應該能提供一些編程的幫助,例如,,語法高亮,,自動補齊,自動排版,,語法檢查等等,。留心觀察一下gedit, vim, emacs, ultraEdit,就會發(fā)現(xiàn)它們提供的遠不是windows 記事本,,寫字板提供的那么簡陋的功能,。對于一種新的語言,新的語法,,它們應該能很方便地提供支持,,而不停留在一種或幾種固定的語言上。 3)用戶可定制性高。 如果想長期從事研發(fā),, 特別是linux/unix下研發(fā)的話,,那么你很有必要學好一個功能足夠的編輯器。有這么一句話:Linux下程序員分為三種,,使用emacs的,,使用vi的,還有其它,。 EMACS是Stallman用lisp語言寫的一個GPL的編輯器,。我們這里所說的emacs指的是GNU emacs,而非Xemacs,。由于它的開放性,,我們可以把它打造成一個功能強大的IDE。我們在安裝好CGYwin之后,,也可以在Windows系統(tǒng)下使用 EMACS,。CGYwin和MINGW是第三方寫的一個在Windows系統(tǒng)上模擬POSIX系統(tǒng)的工具。 EMACS與其說的是一個編輯器,,倒不如說它是一個操作系統(tǒng),。我們可以用它來寫編程,寫wiki,,收發(fā)郵件等等,。EMACS主要是通過兩種方式來進行擴展:el腳本(elisp是lisp的一種方言)和第三方擴展包。EMACS的入門成本很高,。由于是純鍵盤操作,,所以需要記憶大量的快捷鍵;功能強大是通過用戶添加一些擴展包,,lisp腳本來實現(xiàn)的,。如何正確配置和修改是很需要耐心和技巧的。 編譯器 編譯器首選GCC(GNU COMPILER COLLECTION),。原因有兩個,,它是GNU開源的,同時它對標準C++的支持度高達96.15%,。而VC++6.0的支持度只有83.43%,。 GCC不僅是通常意義上的C或C++的編譯器,它還可以編譯java等其它語言,。gcc是gnu c的編譯器,g++是gnu c++的編譯器, 而EGCS(Enhanced GNU Compiler Suite)可以認為是gcc的改進版,。 編譯語言從源程序到目標代碼會經(jīng)過如下幾個階段:源程序->匯編程序->編譯成obj程序->鏈接成最終可執(zhí)行程序。我們可以通過一條編譯指令來完成所有步驟,。也可以分步執(zhí)行,。gcc有三個重要選項-E(只進行預處理), -S(生成匯編代碼), -g(生成帶原代碼調(diào)試符號的可執(zhí)行文件,如果想用gdb調(diào)試的話,就應該在編譯時打開這個選項),。 GCC可以看作一個軟件包,,除了編譯工具,它還集成了調(diào)試器gdb,,性能分析工具gcov, gprof,。只要我們裝好了GCC,這些強大工具就可以直接使用了,。 通過gcov,,我們可以查看一個程序,,源代碼中每行代碼的運行次數(shù),。我們優(yōu)化運行次數(shù)最多的代碼,那么就可以大大優(yōu)化程序,。使用gcov時,,需要打開 GCC的fprofile-arcs和ftest-coverage兩個選項。gcov中常用的選項有-b分支統(tǒng)計信息,。 通過gprof工具,,我們可以查看函數(shù)之間的調(diào)用順序,及各個函數(shù)運行的時間,。我們可以將gprof理解為linux/unix自帶工具time的加強版,。使用gprof時,需要打開GCC的pg選項,。 gcov和 gprof的共同點是在編譯程序時,,加入自己的一些輔助信息,由此來進行程序診斷,。除了,,這些優(yōu)化手段,我們還可以使用一些內(nèi)存泄漏工具,,來減少野指針,,未釋放的內(nèi)存空間。 調(diào)試器 GDB即GNU的調(diào)試器,,它是GCC附帶的一個性能優(yōu)質(zhì)的調(diào)試器,。通過GDB和腳本結(jié)合,我們可以很好的實現(xiàn)回歸測試,。 GDB可以運行于CLI和GUI兩種模式,。默認GDB是CLI模式的,我們可以去下載和安裝GUI模式的GDB,,例如xxgdb,, ddd等。一個更好的方式是在 EMACS中使用GDB。GDB包括visual studio工具的所有調(diào)試功能,,還包括它沒有的功能,。它除了支持,我們一般的設置斷點,,單步跟蹤,,step in, step out, step over等,還有一些強大的功能,。在gdb中,,我們可以有以下幾種暫停方式:斷點(BreakPoint)、觀察點(WatchPoint),、捕捉點(CatchPoint),、信號(Signals)、線程停止(Thread Stops),。 下面列舉幾個讓我印象深刻的功能,。1)通過 watch指令,可以讓程序在某個變量的值發(fā)生變化時,,暫停下來,。2)通過print指令,在程序運行時,,設置變量的值,,運行一個程序自身支持的一個方法。3)通過until指令,,我們可以讓程序在運行到某個程序時暫停下來,。4)通過break.. if指令,使得程序在滿足某個bool表達式時,,暫停下來,。 粘合劑 我想通過“粘合劑”這個詞來表達將多個工具粘合起來的“膠水”。例如,,通過shell腳本,,我們可以把OS命令,sed指令,,awk指令,,其它腳本文件等串聯(lián)起來,發(fā)揮它們的合力,。在linux C++編程中,,我們不可避免地會使用makefile文件。通過,,它我們可以把編譯指令,,生成文檔操作,,清除操作等等串聯(lián)起來。從某種意義上來看,,它也相當于一個粘合劑,。 makefile的出發(fā)點是,維護好一個項目中眾多文件的依賴關(guān)系,,由此得到一個源程序的拓撲圖,。當我們只修改圖中某個結(jié)點時,重新編譯時就只需要將拓撲圖中關(guān)聯(lián)的鏈路進行編譯就好了,。由此,,大大縮短了編譯的時間。make有兩大概念:dependencies和rules,。規(guī)則rule即針對每一個依賴關(guān)系 dependency定義一個操作規(guī)則,。這個細粒度的分離,就可以使我們可以定制軟件構(gòu)建的行為,。例如,,修改使用的編譯器,修改includepath, 修改libpath, 修改編譯選項等等,。我們常見的VC中的nmake,功能和make是類似的,。 make使用的重點和難點是編寫Makefile文件,。Makefile的語法相對其它語言來說是很不一樣的,我們要特別注意TAB鍵和空格鍵的區(qū)別,。有很多工具可以用來幫助我們生成Makefile,。最出名的就是GNU的autoconf了。一個GNU程序的編寫,,需要autoscan, aclocal, autoconf, automake這四個工具,。 我們知道GNU軟件安裝的三步曲是:./configure, make, make install。其中./configure就是根據(jù)autoconf, alocal等工具生成一個makefile文件,。make指令就是調(diào)用make指令來根據(jù)makefile文件的規(guī)則來編譯源程序,。而make install就是執(zhí)行makefile中的install規(guī)則指出的操作(一般是copy操作)。而make clean就是執(zhí)行makefile中的clean規(guī)則指出的操作(一般是rm操作),。我們用Eclispe+CDT開發(fā)Managed C++ Project時,,它就是通過objects.mk,subdir.mk,sources.mk三個文件來生成Makefile。我們注意觀察編譯時的輸出信息,,就可以看到顯示的Makefile文件的內(nèi)容,。 可以說,如果想編譯出跨平臺的C++程序,,那么makefile是一種最方便的機制,。 OCI公司為Douglas C.Schmidt的ACE,,TAO開源社區(qū)編寫了一段偉大的perl腳本--MPC。它由平臺信息,,一個規(guī)則文件,,源代碼,生成用戶想要的工程文件,,例如Make, Nmake, Visual C++ 6, Visual C++ 7等等,。Google Web Tookit, Celtix做的事情與之類似,不過它們是針對JAVA的,,而MPC是針對C++的,。 結(jié)束語 國內(nèi)資料太多的低層次的重復,經(jīng)常是一個網(wǎng)頁被多次轉(zhuǎn)載,,而且回答問題時深度不夠,。個人找資料的順序是:查看quick start或how to文檔->自帶的幫助(如果看起來不太吃力話)->百度查一下中文網(wǎng)頁,來理清一下基本概念->google查一下->幾個大的,,相關(guān)的網(wǎng)站查下資料->看自帶幫助,。再者,面對面的交流是十分重要的,,大家可以相互理一下概念,,交流一下心得??上?,我身邊這種氛圍還是不夠。 Linux下開發(fā)還可以更友好一些,。個人感覺,, linux開發(fā)要在國內(nèi)普通程序員中大規(guī)模普及,還有一段很長的路要走,。ubuntu火爆的主要原因,,就是它幫用戶搭好一些默認配置。用戶如果想新加一些服務,,它們提供了良好,,有效地支持。所以,,我想我們可以在IDE和現(xiàn)在linux這種一個個小部件的這兩種狀態(tài)之間,,取一個折衷。也就是針對幾種主要需求的用戶,,發(fā)布一些配置好的環(huán)境,。尤其是emacs的各種el腳本(例如界面主題的color-theme, C/C++語言編輯策略,,代碼樣式設置腳本,,各種emacs系統(tǒng)設置),, 第三方擴展包(模板template, 編程支持包cedet等)。每一個用戶浪費時間來進行這些配置是十分沒有意義的,!工具始終只是工具,,我們不能淪為工具的奴隸,不能把一大部分精力浪費在配置工具上,。 值得注意的是現(xiàn)在方興未艾的eclipse有向這方面邁進的趨勢,。但是,現(xiàn)在emacs已經(jīng)做得很好了,,ecilpse能否超越它,,我們還有待觀察。我們可以通過在eclipse上安裝SDT插件來進行C++開發(fā),。但是,,它目前還不支持調(diào)試功能,而且不太穩(wěn)定,,功能不夠強,。例如,有時會無故死掉,;如果想通過eclipse來轉(zhuǎn)向函數(shù)原型的話,,那么迎接你的將是一個漫長、焦急的等待,。 由于本人缺少在linux下進行實際大規(guī)模程序的開發(fā)經(jīng)驗,,對很多工具和機制的理解還比較膚淺。對它們的熟悉程度離真正實用,,還有一段很長的路要走。 |