轉至:http://zhwen.org/?p=articles/cscope-tags
linux原始碼提供了製作cscope索引檔案和tags檔案的make命令。
一,軟體安裝
先安裝cscope:
sudo apt-get install cscope
在安裝ctags:
http://ctags.sourceforge.net/
可以使用:ctags –version來查看當前ctags的版本是否是emacs的。
要是安裝了emacs的話就必須使用上面這個地址的ctags,vim不支援emacs的ctags,所以要下載安裝這個ctags,下載之後在源檔案所在目錄運行:
helight@helight-desktop:~/Desktop/ctags-5.7$ ./configurehelight@helight-desktop:~/Desktop/ctags-5.7$ make
即可產生ctags檔案,將這個檔案儲存到“/usr/bin/”目錄下即可。
二,產生索引檔案
在原始碼目錄下使用一下兩條命令即可產生cscope索引檔案和tags檔案。
helight@helight-desktop:~/Downloads/linux-2.6.26$ make cscopeFILELST cscope.filesMAKE cscope.outhelight@helight-desktop:~/Downloads/linux-2.6.26$ make tagsMAKE tagshelight@helight-desktop:~/Downloads/linux-2.6.26$ ls tags -l-rw-r–r– 1 helight ftp 69274841 2008-09-27 11:04 tagshelight@helight-desktop:~/Downloads/linux-2.6.26$ ls cscope.* -l-rw-r–r– 1 helight ftp 23814144 2008-09-25 20:08 cscope.in.out-rw-r–r– 1 helight ftp 609665 2008-09-25 20:06 cscope.list-rw-r–r– 1 helight ftp 174470617 2008-09-25 20:08 cscope.out-rw-r–r— 1 helight ftp 124973256 2008-09-25 20:08 cscope.po.out
三,一般源檔案中產生索引檔案
為了方便使用,編寫了下面的指令碼來更新cscope和ctags的索引檔案:
#!/bin/shfind . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.filescscope -bkq -i cscope.filesctags -R
這個命令會產生三個檔案:cscope.out, cscope.in.out, cscope.po.out。
其中cscope.out是基本的符號索引,後兩個檔案是使用"-q"選項產生的,可以加快cscope的索引速度。
這個指令碼,首先使用find命令,尋找目前的目錄及子目錄中所有尾碼名為".h", ".c"和".c"的檔案,並把尋找結果重新導向到檔案cscope.files中。 然後cscope根據cscope.files中的所有檔案,產生符號索引檔案。最後一條命令使用ctags命令,產生一個tags檔案,在vim中執行":help
tags"命令查詢它的用法。它可以和cscope一起使用。上面所用到的命令參數,含義如下:
-R: 在產生索引檔案時,搜尋子目錄樹中的代碼
-b: 只產生索引檔案,不進入cscope的介面
-q: 產生cscope.in.out和cscope.po.out檔案,加快cscope的索引速度
-k: 在產生索引檔案時,不搜尋/usr/include目錄
-i: 如果儲存檔案清單的檔案名稱不是cscope.files時,需要加此選項告訴cscope到哪兒去找源檔案清單。可以使用“-”,表示由標準輸入獲得檔案清單。
-I dir: 在-I選項指出的目錄中尋找標頭檔
-u: 掃描所有檔案,重建交叉索引檔案
-C: 在搜尋時忽略大小寫
-P path: 在以相對路徑表示的檔案前加上的path,這樣,你不用切換到你資料庫檔案所在的目錄也可以使用它了。
四,在VIM使用cscope尋找
1,載入cscope.out檔案
在VIM中使用cscope非常簡單,首先調用“cscope add”命令添加一個cscope資料庫,然後就可以調用“cscope find”命令進行尋找了。VIM支援8種cscope的查詢功能,如下:例如,我們想在代碼中尋找調用work()函數的函數,我們可以輸入:“:cs
find c work”,斷行符號後發現沒有找到匹配的功能,可能並沒有函數調用work()。我們再輸入“:cs find s work”,尋找這個符號出現的位置,現在vim列出了這個符號出現的所有位置。我們還可以進行字串尋找,它會雙引號或單引號括起來的內容中尋找。還可以輸入一個Regex,這類似於egrep程式的功能。
在原始碼目錄下開啟vim。要使用cscope尋找就必須載入cscope.out檔案.在vim命令列下執行:
:cs add cscope.out
在vim命令列下執行:
:cs helpcscope commands:add : Add a new database (Usage: add file|dir [pre-path] [flags])find : Query for a pattern (Usage: find c|d|e|f|g|i|s|t name) c: Find functions calling this function d: Find functions called by this function e: Find this egrep pattern f: Find this file g: Find this definition i: Find files #including this file s: Find this C symbol t: Find assignments tohelp : Show this message (Usage: help)kill : Kill a connection (Usage: kill #)reset: Reinit all connections (Usage: reset)show : Show connections (Usage: show)
s: 尋找C語言符號,即尋找函數名、宏、枚舉值等出現的地方
g: 尋找函數、宏、枚舉等定義的位置,類似ctags所提供的功能
d: 尋找本函數調用的函數
c: 尋找調用本函數的函數
t: 尋找指定的字串
e: 尋找egrep模式,相當於egrep功能,但尋找速度快多了
f: 尋找並開啟檔案,類似vim的find功能
i: 尋找包含本檔案的文
2,使用cscope尋找do_fork函數的定義:
在vim命令列下執行:
:cs f g do_fork
五,在VIM中使用tags尋找符號:
在vim命令列下執行:
:tag xxx
即可找到你想找的函數或是資料結構或是函數xxx
關於tags的其它用法可以在vim中執行”:help tags”命令進行查詢。
六,其它命令介紹:
ctrl+]:在函數調用的地方跳轉到函數定義的地方
ctrl+t:返回上一個尋找的地方
七,特別注意:
所產生的cscope.out和tags檔案要在開啟VIM所在的檔案夾,否則VIM無法找到相關符號資訊。