1.開發工具java
Windows下,開發工具多以集成開發環境IDE的形式展示給最終用戶。例如,VS2008集成了編輯器,宏彙編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下開發工具使用的經驗之談。因爲,工具品種繁多,咱們沒有能力也沒有必要一一介紹。對於LINUX下IDE工具,例如 eclipse, anjuta等,它們雖然也很實用,可是使用起來比較簡單,並且目前還算不上主流。因此,它們將不被着重介紹。同時,本文也不打算寫成各個工具的操做手冊,只着眼於介紹各個工具的想要解決的問題、運行機理和主要特性。c++
1.1編輯器程序員
要進行開發,第一件事情就是選擇一個合適的編輯器。編輯器選擇有幾個要素:
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腳原本實現的。如何正確配置和修改是很須要耐心和技巧的。shell
1.2編譯器編程
編譯器首選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表達式時,暫停下來。vim
1.3粘合劑windows
我想經過「粘合劑」這個詞來表達將多個工具粘合起來的「膠水」。例如,經過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++的。服務器
對於移植工程來說,基本代碼都在Windows下完成,只須要吧代碼傳到Linux下,而後在Linux下面組織源碼目錄便可。對於傳到Linux編輯,可使用Linux下的vi工具來完成,也能夠經過UltraEdit以Ftp方式打開Linux下的文件進行編輯。vi是Linux下面最經常使用的一個文本編輯器,後面將會介紹vi的一些基本用法。eclipse
有一點值得注意,Windows下文本里面的回車符包含兩個字符‘\n’和‘\r’,而Linux下的文本里面的回車符只包含一個字符‘\n’。這樣,若是上傳文件的時候沒有選擇正確的方式,應該使用文本方式上傳的使用了二進制方式,或者應該使用二進制方式上傳的使用了文本方式,那麼在Linux下都會出現問題,打開的文本當中每一行的行尾就會出現一個‘^M’字符。能夠經過vi的匹配替換功能(稍後會作介紹)或者從新按照正確的方式上傳來解決。
vi是Linux下最經常使用的一個文本編輯器,小巧並且功能強大,一次咱們把它單獨拿出來作一下介紹。若是想了解更詳細的信息,請執行man vi查看其聯機幫助文檔。
vi的工做模式包括命令模式和編輯模式兩種。命令模式下能夠執行vi中定義的一些命令,這些命令跟一些特定的鍵相對應,命令模式下全部的鍵盤相應將會做爲命令來解釋。編輯模式就是編輯文檔的模式,在編輯模式下全部鍵盤的相應都爲做爲文檔輸入的內容。經過ESC鍵能夠從編輯模式切換到命令模式。經過一些編輯命名能夠從命令模式進入編輯模式。
基本命令指的是在命令模式下,經過敲鍵執行的命令,這裏咱們介紹幾個經常使用的命令:
i 在當前開始插入,進入編輯模式
I 在行首開始插入,進入編輯模式
a 在當前字符後追加,進入編輯模式
A 在行尾追加,進入編輯模式
x 刪除當前光標處的字符
X 刪除當前光標前面的字符
D 刪除從光標位置到行尾的全部字符
dd 刪除當前行
dw 刪除當前的單詞
u 取消剛纔的操做
G 跳到文件末尾
此外,在命令模式下,經過輸入‘/’能夠進行查詢,經過輸入‘:’能夠輸入一些其餘命令。輸入‘:’能夠輸入的命令包括:
q 退出
w 保存
wq 保存退出
q! 強制退出,不保存
w! 對受保護的文件強制寫,包括只讀文件
set number 顯示行號 (set nu 也能夠)
數字 跳到某一行
vi的查找功能也很是強大,命令模式下經過輸入‘/’就能夠進入查找模式,能夠輸入要查找的關鍵字。而後能夠經過‘n’來查找下一處。
在輸入‘:’後,還能夠輸入一些匹配替換的命令——「%s」。命令的格式爲「:%s /str1/str2」,執行以後將把當前文件中全部str1替換成str2。舉一個典型的例子,前面咱們說過,Windows下的文本文件若是以二進制的方式傳到了Linux下,那麼vi打開的時候每行的行尾就會出現一個「^M」,咱們能夠用vi打開這個文件,而後經過vi的匹配替換功能去掉這些「^M」。命令格式以下:
:%s /^M//
其中「^M」經過CTRL+V 和 CTRL+M來輸入。
對於簡單的程序,如只有幾個源文件,能夠直接使用編譯器進行編譯,或者把幾條編譯命令寫在一個腳本文件裏面,經過執行腳本文件實現工程的編譯和鏈接。好比只有一個hello.cpp文件的工程,能夠經過以下命令編譯:
CC –o hello hello.cpp
其中CC是編譯器,不一樣的系統下面可能有不一樣的編譯器。通常來講,大多數Linux系統下的C編譯器都叫cc,而C++編譯器叫CC。Linux下面帶的C編譯器爲gcc,C++編譯器爲g++。-o參數用來指定輸出的目標的名稱,也就是編譯後執行程序的名稱。這種狀況下編譯和鏈接一步完成。
對於稍微負責一些的程序,包含多個源文件的,能夠編寫一個編譯腳本,至關於windows下的批處理。以下:
工程中包含hello.cpp、func.cpp、other.cpp,咱們能夠用以下腳原本實現工程的編譯。
CC –c hello.cpp
CC –c func.cpp
CC –c other.cpp
CC –o hello hello.o func.o other.o
多個文件狀況下,把編譯和鏈接分開執行,先逐個編譯源文件,而後再進行連接,造成最終的可執行程序。參數-c就是聲明只進行編譯操做。
當工程達到必定的規模的時候,2.2.1中的作法顯然是不能知足要求的,若是非要那樣作,將會帶來很大的工做量,並且還很是容易出錯。這是咱們就要使用Makefile來幫助咱們完成工程的編譯工做。
Makefile文件至關於一個工程文件,文件中描述了工程中的源代碼、額外須要的庫文件及其路徑、額外須要的頭文件路徑已經編譯器類型、編譯參數等。經過make命令來調入Makefile進行工程的編譯。當執行make命令是,會在當前目錄下搜索名稱爲「Makefile」或者「makefile」的文件,做爲當前編譯的工程文件,也可一指定其餘的工程文件,如make –f MyMakefile。