Linux筆記 gcc與gdb總結

2021-07-22 18:01:40 字數 3444 閱讀 6066

關於gcc:

1.編譯過程

編譯過程是分為四個階段進行的,即預處理(也稱預編譯,preprocessing)、編譯(compilation)、彙編 (assembly)和連線(linking)。

生成檔案(部分):

gcc的-e選項,可以讓編譯器在預處理後停止,並輸出預處理結果。在本例中,預處理結果就是將stdio.h 檔案中的內容插入到hello.c中了。

gcc的-s選項,表示在程式編譯期間,在生成彙編**後,停止,-o輸出彙編**檔案。

這是因為生成的是二進位制檔案

gcc hello.o -o hello
在命令列視窗中,執行./hello, 讓它說helloworld吧!

2.多個程式檔案的編譯

通常整個程式是由多個原始檔組成的,相應地也就形成了多個編譯單元,使用gcc能夠很好地管理這些編譯單元。假設有乙個由hello1.c和 hello2.c兩個原始檔組成的程式,為了對它們進行編譯,並最終生成可執行程式hello,可以使用下面這條命令:

gcc hello1.c hello2.c -o hello

gcc -c hello1.c -o hello1.o

gcc -c hello2.c -o hello2.o

gcc hello1.o hello2.o -o hello

3.庫檔案連線

開發軟體時,完全不使用第三方函式庫的情況是比較少見的,通常來講都需要借助許多函式庫的支援才能夠完成相應的功能。從程式設計師的角度看,函式庫實際上就是一些標頭檔案(.h)和庫檔案(so、或lib、dll)的集合。。雖然linux下的大多數函式都預設將標頭檔案放到/usr/include/目錄下,而庫檔案則放到/usr/lib/目錄下;windows所使用的庫檔案主要放在visual stido的目錄下的include和lib,以及系統資料夾下。但也有的時候,我們要用的庫不再這些目錄下,所以gcc在編譯時必須用自己的辦法來查詢所需要的標頭檔案和庫檔案。

其中inclulde資料夾的路徑是/usr/dev/mysql/include,lib資料夾是/usr/dev/mysql/lib

gcc –c –i /usr/dev/mysql/include hello.c –o hello.o
gcc –l /usr/dev/mysql/lib –lmysqlclient hello.o –o hello
linux下的庫檔案分為兩大類分別是動態鏈結庫(通常以.so結尾)和靜態鏈結庫(通常以.a結尾),二者的區別僅在於程式執行時所需的**是在執行時動態載入的,還是在編譯時靜態載入的。

gcc –l /usr/dev/mysql/lib –static –lmysqlclient test.o –o test
ld會去找gcc命令中的引數-l

再找gcc的環境變數library_path

再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程式內的

動態鏈結時、執行時搜尋路徑順序:

編譯目標**時指定的動態庫搜尋路徑

環境變數ld_library_path指定的動態庫搜尋路徑

配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑

預設的動態庫搜尋路徑/lib

預設的動態庫搜尋路徑/usr/lib

[常用引數詳解]

-c 只啟用預處理,編譯,和彙編,也就是只把程式做成obj檔案

gcc -c hello.c

將生成.o的obj檔案

-s 只啟用預處理和編譯,就是指把檔案編譯成為彙編**。

gcc -s hello.c

將生成.s的彙編**,你可以用文字編輯器察看

-e 只啟用預處理,這個不生成檔案,你需要把它重定向到乙個輸出檔案裡面.

-o 制定目標名稱,預設的時候,gcc 編譯出來的檔案是a.out,很難聽,如果你和我有同感,改掉它,哈哈

-include file

包含某個**,簡單來說,就是便以某個檔案,需要另乙個檔案的時候,就可以用它設定,功能就相當於在**中使用#include

gcc hello.c -include /root/pianopan.h 

-c 在預處理的時候,不刪除注釋資訊,一般和-e使用,有時候分析程式,用這個很方便的

-ldir

制定編譯的時候,搜尋庫的路徑。比如你自己的庫,可以用它制定目錄,不然編譯器將只在標準庫的目錄找。這個dir就是目錄的名稱。  

-o0

-o1

-o2

-o3

編譯器的優化選項的4個級別,-o0表示沒有優化,-o1為預設值,-o3優化級別最高   

-g 只是編譯器,在編譯的時候,產生除錯資訊。

-static

此選項將禁止使用動態庫,所以,編譯出來的東西,一般都很大,也不需要什麼動態連線庫,就可以執行.

-share

此選項將盡量使用動態庫,所以生成檔案比較小,但是需要系統由動態庫.

對gcc的總結:

-e :讓gcc僅進行預處理後就不繼續作下去了

-s :讓gcc僅進行預處理,編譯後就不繼續作下去了

-c :讓gcc僅進行預處理,編譯,彙編後就不繼續作下去了

-o ouput:指定輸出檔案,預設gcc編譯輸出的程式名為a.out.

-i dir,-idir:追加目錄dir到頭檔案的搜尋路徑中

-l dir,-ldir:追加目錄dir到庫檔案的搜尋路徑中

-l library:指定使用的庫檔案,預設gcc在編譯乙個程式時只連線到標準c庫上,是用該選項能夠使他連線到指定的庫上,例如若你要連線到數學庫上(libm.a)則你只須指定 -lm就可以了。也就是說這個選項指定連線的庫檔案可以將字首lib和字尾.a(或.so)省略。

關於gdb:

這兒有更好的

總結:

list或l: 列出原始碼,每次列十行

list加上行號:列出從改行開始的原始碼

list加上函式名:列出該函式的原始碼

next或n:單步執行下一條語句

print或p:列印變數的值

step或s:單步執行下一條語句,有函式進入執行

詳解GCC與GDB 常用的命令

linux下程式設計,少不了和gcc,gdb打交道,現在總結下常用命令,掌握這些足夠用了。gcc常用的選項 o 指定生成的輸出檔案,e 僅執行編譯預處理 gcc的 e選項,可以讓編譯器在預處理後停止,並輸出預處理結果。s 將c 轉換為彙編 gcc的 s選項,表示在程式編譯期間,在生成彙編 後停止 w...

gcc編譯與gdb除錯簡要步驟

gcc編譯過程主要的4個階段 l 預處理階段,完成巨集定義和include檔案展開等工作 i l 根據編譯引數進行不同程度的優化,編譯成彙編 s.s l 用彙編器把彙編 進一步生成目標 o l 用聯結器把生成的目標 和系統或使用者提供的庫連線起來,生成可執行檔案 格式 l gcc e test.c ...

gcc命令與gdb命令常用選項

用法 gcc 選項 檔名 選項 學用命令 1 編譯.c生成可執行檔案 gcc o hello world hello world.c2 編譯.c檔案生成目錄檔案 gcc 0 hello world.o c hello world.c gcc o hello world hello world.o4 ...