gcc/g++命令
使用GNU推出的基於C/C++的編譯器,是開放源代碼領域應用最廣泛的編譯器,具有功能強大,編譯代碼支持性能優化等特點。
選項:
-c:僅執行編譯操作,不進行連接操作;
-o:指定生成的輸出文件;
-wall:顯示警告信息;
-E:僅執行編譯預處理;
-S:將C代碼轉換為匯編代碼;
-g: 在編譯時產生調試信息,使用gdb工具時使用。
實例:
假設源程序文件名為test.c
1. 預處理,.c文件 -> .i文件。
gcc -E test.c -o test.i
2. 編譯,.i文件 -> .s文件。
gcc -S test.i -o test.s
將預處理過程生成的.i后綴的文件轉化成匯編文件,里面存儲的是相應的匯編代碼,這個過程叫做編譯。
3. 匯編,.s文件 -> .o文件。
gcc -c test.s -o test.o
將匯編文件中的匯編代碼翻譯成相應的機器語言,這個過程叫做匯編。
4. 鏈接, .o文件 - 可執行程序
gcc test.o -o test
完成鏈接這個過程,它通過鏈接器ld將運行程序的目標文件和庫文件鏈接在一起,生成最后的可執行文件
如果有多個源文件,基本上有兩種編譯方法,假設有兩個源文件為test.c和testfun.c:
1). 多個文件一起編譯
用法:# gcc testfun.c test.c -o test
作用:將testfun.c和test.c分別編譯后鏈接成test可執行文件。
2). 分別編譯各個源文件,之后對編譯后輸出的目標文件鏈接。
用法:
gcc -c testfun.c //將testfun.c編譯成testfun.o
gcc -c test.c //將test.c編譯成test.o
gcc -o testfun.o test.o -o test //將testfun.o和test.o鏈接成test
gcc和g++的區別
- gcc和g++的區別主要是在對cpp文件的編譯和鏈接過程中,因為cpp和c文件中庫文件的命名方式不同,那為什么g++既可以編譯C又可以編譯C++呢,這時因為g++在內部做了處理,默認編譯C++程序,但如果遇到C程序,它會直接調用gcc去編譯.
- gcc不能自動鏈接庫文件,一般用g++來鏈接庫文件,非要用gcc的話,一般使用gcc -lstdc++命令
- extern “c”對於gcc和g++沒有區別
- 使用g++編譯文件時,g++會自動鏈接標准庫STL,而gcc不會自動鏈接STL;
gdb命令
gdb命令包含在GNU的gcc開發套件中,是功能強大的程序調試器。GDB中的命令固然很多,但我們只需掌握其中十個左右的命令,就大致可以完成日常的基本的程序調試工作。
命令 | 解釋 | 示例 |
---|---|---|
file <文件名> | 加載被調試的可執行程序文件。因為一般都在被調試程序所在目錄下執行GDB,因而文本名不需要帶路徑。 | (gdb) file gdb-sample |
r | Run的簡寫,運行被調試的程序。如果此前沒有下過斷點,則執行完整個程序;如果有斷點,則程序暫停在第一個可用斷點處。 | (gdb) r |
c | Continue的簡寫,繼續執行被調試程序,直至下一個斷點或程序結束。 | (gdb) c |
b <行號> b <函數名稱> b *<函數名稱> b *<代碼地址> d [編號] |
b: Breakpoint的簡寫,設置斷點。兩可以使用“行號”“函數名稱”“執行地址”等方式指定斷點位置。 其中在函數名稱前面加“*”符號表示將斷點設置在“由編譯器生成的prolog代碼處”。如果不了解匯編,可以不予理會此用法。 d: Delete breakpoint的簡寫,刪除指定編號的某個斷點,或刪除所有斷點。斷點編號從1開始遞增。 |
(gdb) b 8 (gdb) b main (gdb) b *main (gdb) b *0x804835c (gdb) d |
s, n | s: 執行一行源程序代碼,如果此行代碼中有函數調用,則進入該函數; n: 執行一行源程序代碼,此行代碼中的函數調用也一並執行。 s 相當於其它調試器中的“Step Into (單步跟蹤進入)”;n 相當於其它調試器中的“Step Over (單步跟蹤)”。 這兩個命令必須在有源代碼調試信息的情況下才可以使用(GCC編譯時使用“-g”參數)。 |
(gdb) s (gdb) n |
p <變量名稱> | Print的簡寫,顯示指定變量(臨時變量或全局變量)的值。 | (gdb) p i (gdb) p nGlobalVar |
q | Quit的簡寫,退出GDB調試環境。 | (gdb) q |
選項:
-cd:設置工作目錄;
-q:安靜模式,不打印介紹信息和版本信息;
-d:添加文件查找路徑;
-x:從指定文件中執行GDB指令;
-s:設置讀取的符號表文件。
文件:
二進制可執行文件。