linux下C++開發工具

就C++開發工具而言,與Windows下微軟(VC, VS2005等)一統天下相比,Linux/Unix下C++開發,可謂五花八門,各式各樣。Emacs, vi, eclipse, anjuta,kdevelop等層出不窮。
Windows下,開發工具多以集成開發環境IDE的形式展示給最終用戶。例如,VS2005集成了編輯器,宏彙編ml,C /C++編譯器cl,資源編譯器rc,調試器,文檔生成工具, nmake。它們以集成方式提供給最終用戶,對於初學者而言十分方便。可是,這種商業模式,直接致使用戶可定製性差,不利於自動化,集成第三方工具的能力弱。例如,沒法定製一些宏來處理一些重複操做;體會不到自動化makefile一步到位快感;沒法遠程登陸到服務器上進行開發;沒法使用某種」粘合劑」來把第三方工具(例如,文本工具,字符串工具)有效地調用起來。能夠說,良好的商業支持和傻瓜式開發,是它們主要的優勢。
在linux下,開發工具被切割成一個個獨立的小工具。各自處理不一樣的問題。例如,編輯器(emacs, vim)用來進行編輯程序的,調試器(gdb)用來調試程序,編譯器(GCC)用來編譯和連接程序的,性能分析工具(gcov, gprof)用來優化程序的,文檔生成器(doxygen)用來生成文檔的。同時,還有一些系統工具和系統知識,咱們是頗有必要了解的:程序自動化機制 makefile,系統粘合劑shell,系統查找工具grep, locate, find。其它的工具(例如ctags, OCI公司的MPC等等),一旦熟練掌握,它們將成爲你手中的利器。
本文主要是一些針對LINUX下開發工具使用的經驗之談。因爲,工具品種繁多,咱們沒有能力也沒有必要一一介紹。對於LINUX下IDE工具,例如 eclipse, anjuta等,它們雖然也很實用,可是使用起來比較簡單,並且目前還算不上主流。因此,它們將不被着重介紹。同時,本文也不打算寫成各個工具的操做手冊,只着眼於介紹各個工具的想要解決的問題、運行機理和主要特性。
正文
編輯器
要進行開發,第一件事情就是選擇一個合適的編輯器。編輯器選擇有幾個要素:
1)減小沒必要要的編輯動做,減小編輯的時間。
一切可以無二義性描述出來的編輯任務,均可以並且應該能被自動化。例如,每個C++程序都會有一個main函數;咱們在定義.h文件時,都但願加入一些預處理指令#define來幫咱們解決重複引用同一個頭文件而帶來的麻煩。鼠標操做老是比鍵盤操做要慢的。這方面EMACS作得可算是到了極致。因此, EMACS用戶常常會吹噓:他們編輯的速度等同於他們思考的速度。
2)可擴展性高。
程序員預期的編輯器應該能提供一些編程的幫助,例如,語法高亮,自動補齊,自動排版,語法檢查等等。留心觀察一下gedit, vim, emacs, ultraEdit,就會發現它們提供的遠不是windows 記事本,寫字板提供的那麼簡陋的功能。對於一種新的語言,新的語法,它們應該能很方便地提供支持,而不停留在一種或幾種固定的語言上。
3)用戶可定製性高。
若是想長期從事研發, 特別是linux/unix下研發的話,那麼你頗有必要學好一個功能足夠的編輯器。有這麼一句話:Linux下程序員分爲三種,使用emacs的,使用vi的,還有其它。
EMACS是Stallman用lisp語言寫的一個GPL的編輯器。咱們這裏所說的emacs指的是GNU emacs,而非Xemacs。因爲它的開放性,咱們能夠把它打形成一個功能強大的IDE。咱們在安裝好CGYwin以後,也能夠在Windows系統下使用 EMACS。CGYwin和MINGW是第三方寫的一個在Windows系統上模擬POSIX系統的工具。
EMACS與其說的是一個編輯器,倒不如說它是一個操做系統。咱們能夠用它來寫編程,寫wiki,收發郵件等等。EMACS主要是經過兩種方式來進行擴展:el腳本(elisp是lisp的一種方言)和第三方擴展包。EMACS的入門成本很高。因爲是純鍵盤操做,因此須要記憶大量的快捷鍵;功能強大是經過用戶添加一些擴展包,lisp腳原本實現的。如何正確配置和修改是很須要耐心和技巧的。
編譯器
編譯器首選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的改進版。
編譯語言從源程序到目標代碼會通過以下幾個階段:源程序->彙編程序->編譯成obj程序->連接成最終可執行程序。咱們能夠經過一條編譯指令來完成全部步驟。也能夠分步執行。gcc有三個重要選項-E(只進行預處理), -S(生成彙編代碼), -g(生成帶原代碼調試符號的可執行文件,若是想用gdb調試的話,就應該在編譯時打開這個選項)。
GCC能夠看做一個軟件包,除了編譯工具,它還集成了調試器gdb,性能分析工具gcov, gprof。只要咱們裝好了GCC,這些強大工具就能夠直接使用了。
經過gcov,咱們能夠查看一個程序,源代碼中每行代碼的運行次數。咱們優化運行次數最多的代碼,那麼就能夠大大優化程序。使用gcov時,須要打開 GCC的fprofile-arcs和ftest-coverage兩個選項。gcov中經常使用的選項有-b分支統計信息。
經過gprof工具,咱們能夠查看函數之間的調用順序,及各個函數運行的時間。咱們能夠將gprof理解爲linux/unix自帶工具time的增強版。使用gprof時,須要打開GCC的pg選項。
gcov和 gprof的共同點是在編譯程序時,加入本身的一些輔助信息,由此來進行程序診斷。除了,這些優化手段,咱們還可使用一些內存泄漏工具,來減小野指針,未釋放的內存空間。
調試器
GDB即GNU的調試器,它是GCC附帶的一個性能優質的調試器。經過GDB和腳本結合,咱們能夠很好的實現迴歸測試。
GDB能夠運行於CLI和GUI兩種模式。默認GDB是CLI模式的,咱們能夠去下載和安裝GUI模式的GDB,例如xxgdb, ddd等。一個更好的方式是在 EMACS中使用GDB。GDB包括visual studio工具的全部調試功能,還包括它沒有的功能。它除了支持,咱們通常的設置斷點,單步跟蹤,step in, step out, step over等,還有一些強大的功能。在gdb中,咱們能夠有如下幾種暫停方式:斷點(BreakPoint)、觀察點(WatchPoint)、捕捉點(CatchPoint)、信號(Signals)、線程中止(Thread Stops)。
下面列舉幾個讓我印象深入的功能。1)經過 watch指令,可讓程序在某個變量的值發生變化時,暫停下來。2)經過print指令,在程序運行時,設置變量的值,運行一個程序自身支持的一個方法。3)經過until指令,咱們可讓程序在運行到某個程序時暫停下來。4)經過break.. if指令,使得程序在知足某個bool表達式時,暫停下來。
粘合劑
我想經過「粘合劑」這個詞來表達將多個工具粘合起來的「膠水」。例如,經過shell腳本,咱們能夠把OS命令,sed指令,awk指令,其它腳本文件等串聯起來,發揮它們的協力。在linux C++編程中,咱們不可避免地會使用makefile文件。經過,它咱們能夠把編譯指令,生成文檔操做,清除操做等等串聯起來。從某種意義上來看,它也至關於一個粘合劑。
makefile的出發點是,維護好一個項目中衆多文件的依賴關係,由此獲得一個源程序的拓撲圖。當咱們只修改圖中某個結點時,從新編譯時就只須要將拓撲圖中關聯的鏈路進行編譯就行了。由此,大大縮短了編譯的時間。make有兩大概念:dependencies和rules。規則rule即針對每個依賴關係 dependency定義一個操做規則。這個細粒度的分離,就可使咱們能夠定製軟件構建的行爲。例如,修改使用的編譯器,修改includepath, 修改libpath, 修改編譯選項等等。咱們常見的VC中的nmake,功能和make是相似的。
make使用的重點和難點是編寫Makefile文件。Makefile的語法相對其它語言來講是很不同的,咱們要特別注意TAB鍵和空格鍵的區別。有不少工具能夠用來幫助咱們生成Makefile。最出名的就是GNU的autoconf了。一個GNU程序的編寫,須要autoscan, aclocal, autoconf, automake這四個工具。
咱們知道GNU軟件安裝的三步曲是:./configure, make, make install。其中./configure就是根據autoconf, alocal等工具生成一個makefile文件。make指令就是調用make指令來根據makefile文件的規則來編譯源程序。而make install就是執行makefile中的install規則指出的操做(通常是copy操做)。而make clean就是執行makefile中的clean規則指出的操做(通常是rm操做)。咱們用Eclispe+CDT開發Managed C++ Project時,它就是經過objects.mk,subdir.mk,sources.mk三個文件來生成Makefile。咱們注意觀察編譯時的輸出信息,就能夠看到顯示的Makefile文件的內容。
能夠說,若是想編譯出跨平臺的C++程序,那麼makefile是一種最方便的機制。
OCI公司爲Douglas C.Schmidt的ACE,TAO開源社區編寫了一段偉大的perl腳本--MPC。它由平臺信息,一個規則文件,源代碼,生成用戶想要的工程文件,例如Make, Nmake, Visual C++ 6, Visual C++ 7等等。Google Web Tookit, Celtix作的事情與之相似,不過它們是針對JAVA的,而MPC是針對C++的。
結束語
國內資料太多的低層次的重複,常常是一個網頁被屢次轉載,並且回答問題時深度不夠。我的找資料的順序是:查看quick start或how to文檔->自帶的幫助(若是看起來不太吃力話)->百度查一下中文網頁,來理清一下基本概念->google查一下->幾個大的,相關的網站查下資料->看自帶幫助。再者,面對面的交流是十分重要的,你們能夠相互理一下概念,交流一下心得。惋惜,我身邊這種氛圍仍是不夠。
Linux下開發還能夠更友好一些。我的感受, linux開發要在國內普通程序員中大規模普及,還有一段很長的路要走。ubuntu火爆的主要緣由,就是它幫用戶搭好一些默認配置。用戶若是想新加一些服務,它們提供了良好,有效地支持。因此,我想咱們能夠在IDE和如今linux這種一個個小部件的這兩種狀態之間,取一個折衷。也就是針對幾種主要需求的用戶,發佈一些配置好的環境。尤爲是emacs的各類el腳本(例如界面主題的color-theme, C/C++語言編輯策略,代碼樣式設置腳本,各類emacs系統設置), 第三方擴展包(模板template, 編程支持包cedet等)。每個用戶浪費時間來進行這些配置是十分沒有意義的!工具始終只是工具,咱們不能淪爲工具的奴隸,不能把一大部分精力浪費在配置工具上。
值得注意的是如今方興未艾的eclipse有向這方面邁進的趨勢。可是,如今emacs已經作得很好了,ecilpse可否超越它,咱們還有待觀察。咱們能夠經過在eclipse上安裝SDT插件來進行C++開發。可是,它目前還不支持調試功能,並且不太穩定,功能不夠強。例如,有時會無端死掉;若是想經過eclipse來轉向函數原型的話,那麼迎接你的將是一個漫長、焦急的等待。
因爲本人缺乏在linux下進行實際大規模程序的開發經驗,對不少工具和機制的理解還比較膚淺。對它們的熟悉程度離真正實用,還有一段很長的路要走。
我以前是一個C程序員,並且是個Windows的程序員,在windows下使用VC6.0/VS2005等microsoft的傻瓜式工具工做, 對於那個vc 6.0/vs2005的快捷操做,debug操做是那麼的熟悉,能夠說vc 6.0/vs2005是window下開發c/c++最好用的工具了,能夠查看調用堆棧,內存變化狀況,變量值,另外安裝 visual assist x後讓VC看起來是那麼的完美。
可是windows下寫成代碼到了linux下是有問題的,因此建議在vc中將工具-》選項—》製表符—》製表符大小4,插入空格,另外的問題就是 那個回車換行的問題,例如windows下是0d,0a,到了linux下用vi看到的都是^M,給別人帶來不便,因此若是提交的服務器是linux,而 你是在windows下開發,能夠在svn/cvs中進行設置,就能夠自動進行dos2unix的轉換,相關的文檔能夠查看svn/cvs的相關手冊,其 中都有這樣的設置。
有幸此次我轉到了Linux下開發,有幸認識了linux,可是隨之而來的就是特別頭疼的問題:Linux下使用什麼工具進行編碼,編譯, debug呢??我感到很是的迷茫,而後就是網上大搜索,看到那麼多的網友推薦VIM時,我失望了,特別的失望,而後用VIM敲了一個下午,累的手的麻 了,感到特別的不爽,就像是用左手拿筷子同樣,全身的力量沒法施展,因此 我仍是計劃再找找看。不事後來我仍是找到了適合本身的工具。呵呵,真是過高興了,今天把我本身這幾天蒐集的一些資料整理一下,給之後轉向linux的程序 員一點提示吧!
主要的工具以下:
1. vim + ctags + taglist + cscope + cppcomplete + global
這個我也試過了,比較有用的帖子以下:
http://www.linuxsir.org/bbs/showthread.php?t=241578
http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx
可是這個要記大量的命令,不過還好,這些命令有兩三天就能夠記住了,
我這裏有個簡單的冊子:
二、文本的操做
~
:e! file1 在當前文件下編輯新的文件
:r /etc/passwd 實現文件的讀入功能
:wq 保持並退出
:q! 強行退出
O :重起一行
U:撤銷 : C-R :重作
dd 刪除一行 d$刪除行後的
e:移動單詞 ge ?—– –à e
%:括號匹配
33G:跳到33行
gg :跳到第一行
C-O /C-I來回跳轉
H –HOME L –last
ma :定義標籤 a,‘a:回到a
C-V文本塊操做
/\
yy :複製一行,p:粘貼
^ 將光標快速跳轉到本行的首行字符
$ 將光標快速跳轉到本行的行尾字符
:m,ny 複製第m行到第n行之間的文本到VI緩衝區

5.三、替換操做
:s/old/new 替換當前行的第一個字符old爲字符new
:s/old/new/g 替換當前行的全部字符old爲字符new
:m,ns/old/new/g 替換當前行號m到行號n的全部字符old爲字符new
:%s/old/new/g 替換整個文本的全部字符old爲字符new

5.七、使用替換的確認功能
:s/old/new/c 替換當前行的第一個字符old爲字符new並提示用戶確認操做
:s/old/new/gc 替換當前行的全部字符old爲字符new並提示用戶確認操做
:m,ns/old/new/gc 替換當前行號m到行號n的全部字符old爲字符new並提示用戶確認操做
:%s/old/new/gc 替換整個文本的全部字符old爲字符new並提示用戶確認操做
:edit foo.txt —編輯另外一個文檔
:next 進行文件切換
C-W 切換窗口
vimdiff main.c~ main.c
:g+//+s/foobar/barfoo/g
CTags:
Ctags –R/ctags *
:set tags =/../tags
:Tlist
F3查找
:make
:cw :cn :cp
mm 標籤,F2 切換
cscope –Rbq
:cs add /../cscope.out /../
:cs find g xxx
:cs find c vim_strsave
:cw
按tab鍵自動補全。
缺點是: 自動補全功能麻煩,必須先創建ctags,寫代碼仍是很累,我寫了一下午,寫的手都麻了。出錯檢查 啊,括號自動匹配啊,
單詞補全功能啊,都不滿意,另外對C++的支持很差。
好比我剛寫了2個config.h,config.cpp,這2個文件
沒有進行CTAG,CSCOPE操做,就不能單詞補全,括號匹配不能檢測,不知道是我配置有問題仍是怎麼回事啊。
另外不能進行DEBUG,因此我只能放棄。
2.emacs+插件
能夠查看
http://blog.163.com/yu_hongchang/blog/static/3989413820081121512613/
這個我沒有試驗,估計和vim同樣,都是命令操做,據說這個功能強大一些,可以經過xterm進行調試,這個我以前用過,可是那個xterm真的不怎麼好用,界面,鼠標,我都不喜歡。
3. kdevelop
這個工具作的比較差勁吧,我也不喜歡,好比他的自動補全功能很不爽,好比:有個函數
Int test(int c1,int c2)
當咱們敲下 tes時,只能出現test,然後面的參數列表都不能顯示,因此當代碼量比較大,函數參數比較多的時候,咱們都記不住參數,沒有參數列表提示,就會以爲很不爽。不過還好,它集成了kgdb能夠進行debug.
4.eclipse +cdt
好多人用這個IDE,還算好吧,可是eclipse是個java的,運行速度慢的很,另外單詞補全功能太差勁了,只能補全結構體或者類,在寫下./ ->以後才能補全,另外要按 control+/ 才能補全,不能在敲代碼的同時自動顯示,eclipse對c/c++的支持遠遠不如對JAVA的支持強大,可是我至少認爲比在vim中寫要舒服一些,可能 是我的習慣了那個IDE的工做環境。
5.code::blocks
能夠查看:
http://www.codeblocks.org/
支持的平臺不全,個人是redhat 企業版 5.0,就安裝不上,因此我也沒有可以一睹它的芳容,惋惜啊。
6. anjuta
這個我下載了安裝不上,不知道爲何,並且要求配置的比較多,也比較麻煩,若是你感興趣,能夠看
http://hi.baidu.com/my2008space/blog/item/140de5255fab81084c088d1e.html
7. Kylix
這個沒有試。
8.netbeans
這個也不錯,我裝過試了試,能知足個人功能,可是可定製稍微差點,可是能知足須要了,也還不錯吧,若是沒有下面要提到的slick edit,我就會選擇它了。
9.windows ue+ssh
有不少的人用這個方法,我不太喜歡,多是不喜歡ue那個界面吧,應該和vim之類的相似。
10.slick edit
呵呵,我最終選擇的是這個,很好用,可定製性強,支持的語言多,很是的好用,可以直接進行debug,並且速度也很快,界面和vc 6.0很類似,是一個惟一能夠和 vc 相媲美的工具,但不是免費的,不過仍是要感謝那些的黑客,讓這個軟件獲得了破解,
你能夠經過下面的連接下載:
http://www.slickedit.com/content/view/409/239/
下載SlickEdit v14.0.2.2
而後到http://download.csdn.net/source/1481066
去下載破解的文件,而後覆蓋就能夠了。
這個工具很是的好用啊,你們能夠試一試啊,
這個工具最好的地方就是能夠查看memory的狀況,這點我喜歡。呵呵
11.編譯工具和DEBUG工具
主要的編譯工具都是gcc,當代碼量大的時候就要寫makefile了,另外的調試工具主要都是gdb,這些可視化的IDE基本都是包裝了gcc, gdb。因此slickedit對於我這種剛轉到Linux,對makefile不熟悉的人來講無疑是一根救命的稻草,能讓我很快的進入工做狀態,固然, 你只是把它當成編輯的工具,也會發現它能大大縮小你編碼的時間,讓你的手不會由於寫代碼而感到疲憊。
終於塵埃落定,之後我要用slickedit來開始個人Linux之旅了。
1. c/c++編譯器 gcc/g++    
詳情請參考網站:http://gcc.gnu.org/
2. UML建模工具 Bouml
linux下比較好用的建模工具,至關於windows下的rational rose,具成了程序UML模型設計,代碼編輯,代碼生成功能等功能.
詳情請參考網站:http://bouml.free.fr/
3. makefile文件編寫工具 :autoconf,automake
不管是在Linux仍是在Unix環境中,make都是一個很是重要的編譯命令。無論是本身進行項目開發仍是安裝應用軟件,
咱們都常常要用到make或 make install。利用make工具,咱們能夠將大型的開發項目分解成爲多個更易於管理的模塊,
對於一個包括幾百個源文件的應用程序,可是若是經過查閱make的幫助文檔來手工編寫Makefile,對任何程序員都是一場挑戰。
幸而有GNU 提供的Autoconf及Automake這兩套工具使得編寫makefile再也不是一個難題
使用make和 makefile工具就能夠垂手可得的理順各個源文件之間紛繁複雜的相互關係,autoconf,automake通常配合libtool使用。
詳情請參考網站:
http://www.ibm.com/developerworks/cn/linux/l-makefile/
http://www.gnu.org/software/autoconf/
http://www.gnu.org/software/automake/
http://www.gnu.org/software/libtool/
4. 調試工具:gdb
在window下編程,調試工具已經具成到VS環境,在linux/Unix下調試則經過gdb來調試,我的以爲gdb調試比vs調試高效不少。
詳情請參考網站:http://www.gnu.org/software/gdb/
5. 內存泄漏工具:valgrind
對於動則成千上萬行的代碼,很難經過手工的方式去保證內存沒有泄漏,
valgrind經過內存申請、釋放匹配的原則來檢測內存泄漏,內存越界的BUG。固然,良好的編程習慣也是保證代碼質量高效必不可少的條件。
參考網站:http://valgrind.org/
6. 源代碼管理工具:svn
軟件開發再也不是我的大師的年代,都是以團隊的方式來開發,如何保證代碼的同步,協同開發,svn給咱們提了很好的幫助。
詳情請參考網站:http://svncorp.org/
7. 網絡協議分析工具:wireshark
編寫網絡程序,就不可避免要處理網絡協議,分析網絡數據.wireshark提供了關於網絡層和上層協議的各類信息。
命令行下分析網絡協議可使用tcpdump.php

相關文章
相關標籤/搜索