1.gcc安裝
rpm -qa|grep gcc ==>檢查gcc是否安裝
gcc -v ==>檢查gcc版本 yum -y install gcc ==>安裝gcc
2.基本語法
gcc最基本的用法是:gcc [options] [filenames]
說明:如果已經為最新的目標文件,則不重新編譯。使用示例test.c源碼如下:
#include <stdio.h> int main(void) { printf("Hello world/n"); return 0; }
(1)編譯-c
gcc -c test.c ==>編譯不鏈接生成目標文件test.o gcc -c test.c -o test.o ==>同上 gcc -c -o test.o test.c ==>同上
(2)鏈接-o
gcc test.o -o test==>鏈接生成可執行文件test
(3)編譯鏈接-o
gcc test.c -o test ==>編譯鏈接生成可執行文件test
(4)代碼優化-O和引用頭文件目錄-I
gcc –c –O –I dirname test.c ==>使用系統庫則不用特意指出/usr/lib和/lib
(5)函數庫引用-lname
-lname 鏈接時裝載名為 libname.a 的函數庫。例如,-lm 表示鏈接名為 libm.a 的數學函數庫。
gcc test.c testsub.c -lm -o test
補充:自定義函數庫(打包中間目標文件)ar命令
如果需要鏈接中間目標文件太多,鏈接時需要明顯地指出所有中間目標文件名,十分不便。可以給中間目標文件打個包,在Windows下這種包叫“庫文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件靜態庫。
PS:我們可以使用中間目標文件(O文件或是OBJ文件)或靜態庫文件來鏈接我們的應用程序。
ar crv libtest.a *.o ==>將該目錄下的所有目標文件打包生成了libtest.a文件靜態庫
3.警告信息選項
使用示例main.c源文件如下:
#include <stdio.h>
void main(void)
{
long long int var = 1; printf("It is not standard C code!/n"); }
(1)-pedantic
當gcc在編譯不符合ANSI/ISO C 語言標准的源代碼時,將產生相應的警告信息。
執行語句 gcc -pedantic main.c -o main
(2)-Wall
使 gcc 產生盡可能多的警告信息,建議在用 gcc 編譯源代碼時始終帶上 -Wall 選項。
執行語句 gcc -Wall main.c -o main
(3)-Werror
gcc 將所有的警告當成錯誤進行處理,產生警告地方停止編譯,這在使用自動編譯工具(如 Make 等)時非常有用。
執行語句 gcc -Werror main.c -o main
(4)-w
關閉任何以W開頭的警告信息,,建議不要使用此項。
執行語句 gcc -w main.c -o main
4.使用gdb進行調試
gdb是Linux下一款功能強大的調試工具。默認情況下,gcc 在編譯時不會將調試符號插入到生成的二進制代碼中,因為這樣會增加可執行文件的大小。如果需要在編譯時生成調試符號信息,可以使用 gcc 的 -g 或 -ggdb 選項。
(1)gdb功能
設置斷點
監視程序變量的值
l程序的單步執行
顯示、修改變量的值
顯示、修改寄存器
查看程序的堆棧情況
遠程調試
(2)gdb調試過程
a.程序經過預處理后,即進入編譯階段,進入編譯階段,首先聲明編譯:
b.格式:gdb test.c -o test -g
c.進入編譯:gdb test
d.顯示需要編譯調試的源程序:l(list)//list filename
e.設置斷點:b(break)行號
f.查看設置的斷點:info b
g.運行調試程序:run
h.跳到下一個斷點:c(continue)
i.單步運行的話使用:n(next)/s(step into)跳到函數體 //區別在與:next執行函數體,而step不執行函數體
j.調試過程中查看某個變量的變化:print i (每次都要手動設置)//display i(設置一次一直尾隨,直到用“undisplay 變量標號” 停止)
k.退出當前的調試使用finish 跳出函數
l.清楚斷點 clear 行號
m.Delete 斷點信息序號// 刪除所有斷點或設置的要刪除的斷點
n.退出調試 q
o.b num if i==20 設置斷點的觸發條件
p.condition num i==50 改變斷點的觸發條件
(3)常用命令匯總
1 (1) gdb 可執行文件 : 表示對某個文件進行調試 2 (2) b 函數名/行數 : 在某個函數名或行數前設置斷點 3 (3) run/r : 表示開始運行,如果是正在調試的程序的話,表示再次進行調試 4 (4) n/next : 表示執行下一行語句 5 (5) l/list : 列出源碼默認10行(當前位置的上下共10行) 6 list 行號 : 列出行號上下共10行的源碼 7 list 函數名 : 列出函數名上下共10行的源碼 8 (6) s/step : 表示單步執行,進入函數 9 (7) p /x 變量名 : 按16進制輸出變量的值 10 /d : 按10進制 11 /o : 按八進制 12 (8) set var 變量名=值 : 設置變量的值 13 (9) bt(backtrace) : 查看各級函數調用及參數,簡寫bt 14 (10)q/quit : 退出 15 (11)finish : 連續運行到當前函數返回為止,然后停下來等待命令 16 (12)continue/c : 跳轉到下個斷點,或者跳轉到觀察點 17 (13)ptype 變量名 : 可以查看變量的類型,簡寫為pt 18 (14)watch 19 作用:一般用來觀察某個變量/內存地址的狀態(也可以是表達式), 20 如可以監控該變量/內存值是否被程序讀/寫情況。 21 有三種方法: 22 1.watch expr(指定變量/內存地址/表達式) 23 一旦expr的值有變化時,將停住程序。 24 2.rwatch expr 25 當expr被讀時,停住程序。 26 3.awatch expr 27 當expr被讀或被寫時,停住程序。 28 watch使用步驟: 29 1. 使用break在要觀察的變量所在處設置斷點; 30 2. 使用run執行,直到斷點; 31 3. 使用watch設置觀察點; 32 4. 使用continue觀察設置的觀察點是否有變化。 33 (15)start : 開始執行程序,停在main函數第一行語句前面等待命令 34 (16)info watchpoints : 列出所有觀察點 35 info breakpoints : 查看當前設置的所有斷點 36 (17)d/delete [breakpoinsts num] [rang...] 37 d/delete : 刪除所有斷點 38 d/delete num : 刪除breakpoints為num的斷點 39 d/delete num1-num2 : 刪除breakpoints為num1-num2的斷點 40 (18)enable num : 啟用num號斷點 41 (19)disable num : 關閉num號斷點 42 (20)u/until : 結束當前循環
5.IDE工具
可以使用IDE工具codeblocks
參考文檔: