gcc/makefile/gdb常用命令

來源:互聯網
上載者:User

常用命令

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.