就C++開發工具而言,與Windows下微軟(VC, VS2005等)一統天下相比,Linux/Unix下C++開發,可謂五花八門,各式各樣。Emacs, vi, eclipse, anjuta,kdevelop等層出不窮。java
Windows下,開發工具多以集成開發環境IDE的形式展示給最終用戶。例如,VS2005集成了編輯器,宏彙編ml,C /C++編譯器cl,資源編譯器rc,調試器,文檔生成工具, nmake。它們以集成方式提供給最終用戶,對於初學者而言十分方便。可是,這種商業模式,直接致使用戶可定製性差,不利於自動化,集成第三方工具的能力弱。linux
例如,沒法定製一些宏來處理一些重複操做;體會不到自動化makefile一步到位快感;沒法遠程登陸到服務器上進行開發;沒法使用某種粘合劑來把第三方工具(例如,文本工具,字符串工具)有效地調用起來。能夠說,良好的商業支持和傻瓜式開發,是它們主要的優勢。c++
在linux下,開發工具被切割成一個個獨立的小工具。各自處理不一樣的問題。例如:程序員
編輯器(emacs, vim) 用來進行編輯程序的
調試器(gdb) 用來調試程序
編譯器(GCC) 用來編譯和連接程序的
性能分析工具(gcov, gprof) 用來優化程序的
文檔生成器(doxygen) 用來生成文檔的shell
同時,還有一些系統工具和系統知識,咱們是頗有必要了解的:程序自動化機制 makefile,系統粘合劑shell,系統查找工具grep, locate, find。其它的工具(例如ctags, OCI公司的MPC等等),一旦熟練掌握,它們將成爲你手中的利器。編程
本文主要是一些針對LINUX下開發工具使用的經驗之談。因爲,工具品種繁多,咱們沒有能力也沒有必要一一介紹。對於LINUX下IDE工具,例如 eclipse, anjuta等,它們雖然也很實用,可是使用起來比較簡單,並且目前還算不上主流。因此,它們將不被着重介紹。同時,本文也不打算寫成各個工具的操做手 冊,只着眼於介紹各個工具的想要解決的問題、運行機理和主要特性。ubuntu
編輯器
要進行開發,第一件事情就是選擇一個合適的編輯器。編輯器選擇有幾個要素:
1)減小沒必要要的編輯動做,減小編輯的時間。
一切可以無二義性描述出來的編輯任務,均可以並且應該能被自動化。例如,每個C++程序都會有一個main函數;咱們在定義.h文件時,都但願加入一些預處理指令#define來幫咱們解決重複引用同一個頭文件而帶來的麻煩。鼠標操做老是比鍵盤操做要慢的。這方面 EMACS作得可算是到了極致。因此, EMACS用戶常常會吹噓:他們編輯的速度等同於他們思考的速度。vim
=============================================================================windows
LISP(全名LISt Processor,即鏈表處理語言),由約翰·麥卡錫在1960年左右創造的一種基於λ演算的函數式編程語言。
LISP有不少種方言,各個實現中的語言不徹底同樣。各類LISP方言的長處在於操做符號性的數據和複雜的數據結構。1980年代Guy L. Steele編寫了Common Lisp試圖進行標準化,這個標準被大多數解釋器和編譯器所接受。在Unix/Linux系統中,還有一種和Emacs一塊兒的Emacs Lisp(而Emacs正是用Lisp編寫的)很是流行,並創建了本身的標準。
LISP的祖先是1950年代Carnegie-Mellon大學的Newell、Shaw、Simon開發的IPL語言。
LISP語言的主要現代版本包括Common Lisp和Scheme。
lisp擁有理論上最高的運算能力
lisp在cad繪圖軟件上的應用很是普遍,普通用戶都可以用lisp編寫出各類定製的繪圖命令。
=============================================================================
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是GUN c的編譯器, g++是GUN 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下進行實際大規模程序的開發經驗,對不少工具和機制的理解還比較膚淺。對它們的熟悉程度離真正實用,還有一段很長的路要走。