gcc編譯器可以將C、C++等語言源程序、匯編程序編譯、鏈接成可執行程序。
gdb是 GNU 開發的一個Unix/Linux下強大的程序調試工具。
linux下沒有后綴名的概念。但 gcc 根據文件的后綴來區別輸入文件的類別:
.c C語言源代碼文件
.a 由目標文件構成的庫文件
.C、.cc、.cpp C++源碼文件
.h 頭文件
.i 經過預處理之后的 C 語言文件
.ii 經過預處理之后的 C++ 文件
.o 編譯后的目標文件
.s 匯編源碼文件
.S 經過預編譯的匯編源碼文件
程序由C、C++源代碼到可執行文件共經過了四個階段:
預處理 該階段主要對源碼進行頭文件展開、宏替換等操作
編譯 該階段將經過預處理之后的代碼編譯成 .s 匯編文件
匯編 該階段將匯編文件翻譯成 .o 的中間代碼
鏈接 該階段將用戶文件和庫文件進行鏈接,最終生成可執行文件
gcc 格式有如下兩種:
第一種:gcc 選項 目標文件名 源文件名
第二種:gcc 源文件名 選項 目標文件名
gcc四個階段的處理過程
預處理: gcc -E -o hello.i hello.c
gcc -E hello.c -o hello.i
編譯: gcc -S -o hello.S hello.i
gcc -S hello.i -o hello.S
匯編: gcc -c -o hello.o hello.S
gcc -c hello.S -o hello.o
鏈接: gcc -o hello hello.o
gcc hello.o -o hello
也可以一條命令產生可執行文件: gcc -o hello hello.c
gcc hello.c -o hello
gcc常用選項:
編譯選項
選項 內容 目標文件格式
-c 只預編譯、編譯、匯編,不鏈接 .o
-E 只預處理,不編譯 .i
-S 只預處理、編譯,不匯編 .S
-o file 生成名為 file 的文件
-g 在可執行文件中包含調試信息
-v 輸出編譯過程和編譯器版本信息
-static 鏈接靜態庫
-I dir 添加 dir 的頭文件搜索目錄
-L dir 添加 dir 的庫文件搜索目錄
-Iname 鏈接名為 libname.so 的庫文件
警告和出錯選項
-ansi 輸出符合 ANSI C 標准的警告信息
-pedantic 輸出 ANSI C 標准的全部警告信息
-Wall 輸出 gcc 提供的所有警告信息
-w 關閉所有警告信息
-Werror 將所有警告轉化為錯誤
優化選項
-O或O1 一級優化,告訴 gcc 減小代碼長度和執行時間
-O2 二級優化,除了進行 O1 之外,還要進行額外調整,如處理器指令調度
-O3 三級優化,除了進行 O2 之外,還要進行循環展開等調整優化
使用 gdb 進行程序調試之前,gcc編譯選項必須加上 -g 選項來講調試信息加到可執行文件中。
命令行中輸入:gdb 可執行文件 即可啟動 gdb 對其進行調試
gdb 命令:
list 或 l [行號或函數名] 查看指定位置代碼,接行號會將該行顯示於屏幕中央。如果多個文件,可以輸入 l file:行號或函數名
run 或 r 運行代碼
break 或 b [行號或函數名] [條件表達式] 在某行或某函數處設置斷點,也可以當條件滿足時斷點才生效
info b 查看斷點信息
delete 斷點號 刪除斷點
disable 斷點號 將某斷點失效
enable 斷點號 生效某斷點
step 或 s 單步執行,進入子函數
next 或 n 單步執行,不進入子函數
continue 或 c 繼續執行,直到下一斷點或程序結束
print 或 p 表達式或變量 查看表達式或變量的值
set variable 變量=值 修改變量值