從windows到 nix 六 程式開發

2021-08-25 00:05:44 字數 3008 閱讀 4678

提綱

整合環境

編譯器(gcc)

偵錯程式(gdb,printf)

依賴管理(make)

搜尋**(grep)

**編輯器(vim)

**內跳轉(ctag,cscope)

函式和類列表(taglist)

自動補全(^n, ^x^o)

編譯錯誤/**對應(make+vim)

程式設計師手冊(man)

從這一章開始,要開始講大家最關心的問題了,就是究竟在*nix下怎麼寫程式?

下面用公認的開發難度最大的c/c++為例

windows下一般都會使用乙個預置的整合環境,例如visual studio,*nix下你同樣需要乙個整合環境,所不同的是,在第一次使用這個整合環境時,你需要多做點工作。根本原因在於整合環境中的每乙個部件是由不同的人或組織開發的。

編譯器

不管是windows還是*nix,編譯器基本上都是命令列工具的集合,這一點很統一,如果你在windows透過圖形介面修改過編譯選項,那麼你很容易理解這一點,雖然各工具的命令列的選項會有區別。一般來說*nix下最常使用的編譯器是gcc。

依賴管理

windows下的程式設計師可能沒有接觸過這個概念,但是你卻每天都在使用,想想當你每次按下編譯時,只有你修改過的原始檔會被重新編譯。而且,你按下的是編譯,但是卻執行了數個編譯命令,包括預處理,編譯,鏈結。

這個過程在*nix下,由make來負責。make解析乙個叫makefile的檔案,makefile中描述了目標、依賴和動作。每當make發現依賴新於目標時,就會呼叫動作來生成目標。

visual studio的早期版本,如vc6也支援make的方式生成程式,可以從工程檔案中匯出makefile,現在不知道是不是給改沒了。

使用makefile有乙個好處,相比gui程式管理乙個工程檔案來說,makefile有完備的語法,可供程式設計師手工修改來擴充套件功能。

makefile基本結構很簡單,如下:

# 可以定義變數 var1=「value" var2=$(var1) ...... # 可以指定乙個目標及生成這個目標的依賴,再下面是執行的動作 target1: dep.c dep.h $(cc) dep.c -o target1 # 更多的目標及依賴 target2: ......

而使用make命令時,是make後面加乙個目標名,如果省略目標名,則預設為第乙個目標。makefile中除了可以定義變數,也可以使用預定義變數,例如$(cc)就是乙個預定義變數,其值為系統之中預設的c編譯器名。除此之外還可以在make命令列中指定變數的值。

下面是一些例子:

$ make # 構建預設目標,也就是第乙個目標 $ make target2 # 構建target2這個目標 $ make cc=gcc # 把變數cc的值指定為gcc進行構建 $ make -f linux.mk # 使用linux.mk作為makefile

makefile可以使用任意名字來作為目標,但是在約定中,有一些固定的目標名:

all 執行預設動作,省略目標名的時候執行的就是這個

install 執行安裝動作

clean 執行清理動作

更多的細節可以去看gnu make的手冊。如果你隨便找幾個開源**的makefile看一眼,你就知道手寫乙份makefile是一件多麼繁瑣的事情了,為避免無意義的重複勞動,或者增加記憶負擔,可以找一些通用的makefile模板來應付一些簡單工程,我推薦大家在能看懂makefile之後,放棄手寫makefile,轉而使用程式生成,也即學習autoconf,automake的使用,這個下一章再講。

編碼過程

vim還是需要學習的,下面用faq的形式羅列一些常用的技巧點滴:

1. 我的vim沒有你說的功能呀

請自己從原始碼編譯乙個全功能的高版本vim,有些系統上提供的是閹割版的vim。命令列下輸入vim --version可以看當前的版本。

2. vimrc的配置好麻煩

在~/.vimrc檔案中寫入一行

so $vimruntime/vimrc_example.vim

這是乙個預置的配置檔案,一般滿足大多數人的要求

4. 怎麼在多個檔案中查詢

第一種方法::grep foo * -r

第二種方法::vim foo **/*.[ch]

5. 怎麼跳轉到函式或結構定義

安裝ctags, 把生成tag檔案的命令繫結到vim中的某個熱鍵。然後第一次使用時需要按一下熱鍵,以後把游標定位到foo上,按ctrl+]跳轉過去,然後可以試試ctrl+i和ctrl+o,乙個前進乙個後退的

6. 我想看到乙個函式和類成員的列表

安裝taglist,這是vim的乙個外掛程式

7. 上面的taglist使用後多出乙個視窗,我不會在視窗間切換

ctrl+ww切換視窗

zz關閉當前視窗

8. 怎麼編輯多個檔案

:e. 然後你就知道怎麼回事了

:bn 當你編輯了多於乙個檔案時,下乙個檔案

:bp 上乙個檔案

同時編輯的檔案太多的時候,安裝buffer explorer,這是vim的乙個外掛程式

10. 我想暫時離開vim做點事

請使用ctrl+z,你會回到shell

fg 你會再次回到vim

千萬不要傻乎乎的關閉vim,這浪費你很多時間

11. 我知道被windows慣壞了,還是想問一下,如何自動補全

如果想嘗鮮可以試試輸入一次詞一半時,按ctrl+n,再詳細的用法也可以上網查查vim+omni補全

不過我用了這麼長時間的vim真沒怎麼用到補全

12. 我想看庫函式的原型

如果你知道是什麼函式,你可以用man,例如在vim中,可以把游標定位printf上,然後按k,或者回到shell,輸入 man printf。特別的,對於像stat這種函式,man出來的是stat命令,你需要輸入man 2 stat

如果你不知道是什麼函式,google之

man相比google的好處,我覺得有兩個:當你知道是什麼的時候,man比較快;有些庫函式的版本眾多,man出來的資訊和你當前系統中的更貼近

從windows到 nix 四 編輯器

本文是針對vi來說的,因為它及它的變種在 nix上使用最廣泛,但是挫敗的使用者數卻最多。使用者遵循某安裝或者配置指示,一路順利,直到遇到 用vi編輯 x.conf,在其中加入 x 沒經驗的使用者不但無法繼續,就連退出vi都是乙個難題。雖然 nix上還有其他更適合windows使用者習慣的編輯器,但是...

Socket程式從windows移植到linux下

1 標頭檔案 windows下winsock.h或winsock2.h linux下netinet in.h 大部分都在這兒 unistd.h close函式在這兒 sys socket.h 在in.h裡已經包含了,可以省了 2 初始化 windows下需要用wsastartup啟動ws2 32.l...

從Windows到linux小記

從windows到linux小記 年後瘋狂加班,趁著喘息的時間,更新一下安裝linux的艱辛路程。周四晚上,公司舉辦活動,好不容易從加班的節奏暫時脫離出來,我這人就是不能閒,只要一閒下來就會做die,蓄謀已久的裝linux系統終於突破了我的理智。按照以往給電腦安裝系統的步驟一般都是 備份資料 格盤 ...