常用命令
indent自動調整C代碼的縮排格式,預設下使用GNU風格
gcc編譯器:源檔案(c)-----------預先處理------>預先處理輸出檔案(.i)-------編譯----->彙編檔案(.s)---------彙編------>目標檔案(.o)----------串連-------->可執行檔(.out)
gcc -S hello.c 輸出hello.s
gcc-c hello.c b.c 輸出hello.o b.o
gcc hello.c 預設輸出a.out
gcc -o hello hello.c 輸出hello.out
串連時的“庫檔案”
標準函數庫檔案linux系統位置:/lib/ /usr/lib/
標準標頭檔位置:/usr/inclue/
不過gcc預設情況下只搜尋標準C語言庫/標準C標頭檔,僅吧庫檔案放在標準目錄中行不同。如果是標頭檔,需要加上-l dir,庫檔案加上-L dir(若-L . 搜尋的時候增加目前的目錄)
靜態和共用函數庫:
調用靜態函數庫中的某個函數,首先找到定義該函數的標頭檔,然後從庫檔案搜尋路徑中尋找對應的函數,只將使用到的函數加入產生的可執行檔中。
共用方式,只包含一個函數引用,好處是整個記憶體中值儲存一份拷貝,並且檔案/usr/lib/libm.so是對實際庫檔案修訂版(/usr/lib/libm.so.N,N為版本號碼)的符號連結,這樣它的更新獨立於用它的應用程式。並且,linux啟動應用程式時,它會考慮應用程式需要的函數庫版本,以防止新的主要版本函數庫使舊的應用程式不能使用。
對linux系統,負責裝載共用庫並解析客戶程式的函數應用的程式(動態裝載器)是ld.so,也可能是ld-linux.so.2/ld-linux.so.1.搜尋共用庫的其他位置可以在檔案/etc/ld.so.conf中配置,如果修改了這個檔案,就需要用命令ldconfig來處理。我們可以通過運行工具ldd來查看程式需要的共用庫。
共用庫在許多方面類似Windows中使用的動態連結程式庫。.so庫對應於.DLL檔案,在運行時載入,而.a庫類似與.LIB檔案,包含在可執行檔中。
下面看一個產生自己的庫檔案的樣本:
pro1.c 包含函數pro1
pro2.c 包含函數pro2
lib.h 標頭檔,包含函數pro1和函數pro2的聲明
用ar crv libfoo.a pro1.o pro2.o可產生靜態庫檔案libfoo.a,如果該庫檔案放在目前的目錄下,當另一個程式include標頭檔lib.h的時候,串連時候的命令是
gcc -o pro pro.o -L . libfoo.a(-L 表示搜尋庫檔案的路徑加入當前路徑)
nm命令可以用來擦汗看目標檔案/函數庫/可執行檔裡包含的函數。
make工具一個Makefile檔案有一系列的make規則,每條make規則的格式是:目標(target): 依賴(dependency)檔案清單
<TAB>命令(command)列表
target:即make最終要建立的檔案
dependency:通常是編譯目標檔案所需要的其他檔案,如.c .h .o 等
command: make執行的動作,每個命令佔一行,可通過“\”換行
一個Makefile檔案:
test: prog.o code.o gcc -o test prog.o code.oprog.o: prog.c prog.h code.h gcc -c prog.c -o prog.ocode.o: code.c code.h gcc -c code.c -o code.oclean: rm -f *.o
make執行的時間戳記檢查過程:
make根據一個target所依賴檔案時間戳記決定是否需要執行一個target
如果命令列輸入make,預設執行第一個target test。test依賴prog.o code.o,make會往後檢查是否有有和prog.o同名的target,如果有,則檢目標prog.o的依賴的時間戳記,以決定是否要執行target prog.o;如果沒有,則開始直接檢查這些依賴檔案的時間戳記。這樣一個遞迴的過程。
make中的變數
- 自訂變數:定義OBJ=prg.o code.o 使用${OBJ}
- 環境變數 : 直接使用
- 預定義變數
- 自動變數
| 預定義變數 |
含義 |
| $@ |
當前目標檔案的名字,如應用於建立庫函數時,它的值就是庫檔案名稱 |
| $? |
比當前目標檔案新的依賴檔案(即當前目標檔案所依賴的那些檔案)列表 |
| $< |
比當前檔案新的第一個依賴檔案檔案 |
| $^ |
用空格隔開的所有依賴檔案(重複出現的檔案名稱只有一個,如果有的話) |
GNU 調試工具 gdb
設定斷點 break<行號> break<函數名> 多檔案break<檔案名稱:行號>break<函數名> 條件 break<行號/函數名> if <條件運算式>
逐步執行 step(進入函數)/ next(不進入函數)
查看原始碼: list 預設顯示當前行附近10行,list [m, n]
查看協助文檔:help
監視程式中的變數: print whatis
設定變數的值: set
兩篇常見C錯誤gdb調試實戰:http://www.diybl.com/course/6_system/linux/Linuxjs/200875/130421.html
http://blog.chinaunix.net/space.php?uid=317451&do=blog&id=92412