基於Linux的C程式設計(一)
一、GCC概述
1、GCC概述
一個c/c++程式從開始編碼到生成二進位制可執行檔案至少要經過四個步驟。
(1)預處理:對原始檔的巨集進行展開。
(2)編譯:將源程式編譯成彙編檔案。
(3)彙編:將彙編檔案編譯成機器碼。
(4)連結:將目標檔案和外部符號進行連結,生成可執行檔案。
GCC在編譯時根據輸入檔案類別和引數選項,可以分別完成上述四個步驟,產生對應的處理檔案,也可以一次性完成所有步驟,直接生成可執行檔案。
下面是一些GCC副檔名規範:
(1).c為字尾的檔案,是C語言原始碼檔案。
(2).h為字尾的檔案,是標頭檔案。
(3).C,.cc,.cpp,.cp或.cxx為字尾的檔案,是c++原始碼檔案。
(4).h為字尾的檔案,是程式所包含得而標頭檔案。
(5).i為字尾的檔案,是已經預處理過的C原始碼。
(6).ii為字尾的檔案,是已經預處理過的c++原始碼檔案。
(7).m為字尾的檔案,是object-c原始碼檔案。
(8).o為字尾的檔案,是編譯後的目標檔案。
(9).s為字尾的檔案,是組合語言原始碼。
(10).S為字尾的檔案,是經過預編譯的組合語言原始碼檔案。
2.GCC使用方法
在使用GCC編譯器的時候,我們必須給出一系列必要的引數選項和檔名稱。
GCC最基本的用法是:gcc [options] [filenames]
其中options就是編譯器需要的選項,filenames給出相關的檔名稱。下面介紹基本的幾個常用選項:(假設源程式檔名為test.c)
(1)無選項編譯連結
用法:gcc test.c
作用:將test.c預處理、彙編、編譯並連結形成可執行檔案。這裡未指定輸出檔案,預設輸出為a.out
(2)選項-o
用法:gcc test.c -o test
作用:將test.c預處理、彙編、編譯並廉潔成可執行檔案test。-o選項用來指定輸出檔案的檔名。
(3)選項-E
用法:gcc -E test.c -o test.i
作用:將test.c預處理輸出test.i檔案。
(4)選項-S
用法:gcc -S test.i
作用:將預處理輸出檔案test.i彙編成test.s檔案
(5)選項 -c
用法:gcc -c test.s
作用:將彙編輸出檔案test.s編譯輸出test.o檔案。
(6)無選項鍊接
用法:gcc test.o -o test
作用:將編譯輸出檔案test.o連結成最終可執行檔案。
(7)選項-O
用法:gcc -O test.c -o test
作用:使用編譯優化級別編譯程式。級別為1-3,級別越大優化效果越好,但編譯時間越長。
(8)多原始檔的編譯方法
如果有多個原始檔,基本上有兩種編譯方法(假設有兩個原始檔為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
以上兩種方法相比較,第一種方法編譯時需要所有的檔案重新編譯,而第二種方法可以只重新編譯修改的檔案,未修改的檔案不用重新編譯。
3、c程式除錯
c程式的除錯分為靜態除錯和動態除錯。靜態除錯用在程式編譯階段查錯並修正錯誤,它主要利用GCC編譯器對語法錯誤的檢查進行排錯。
動態除錯則用在程式執行階段的錯誤檢查與修正,適用於檢查演算法的錯誤、輸入輸出的錯誤等。
程式的動態除錯需要藉助除錯工具,Linux系統包含了一個叫gdb(GNU DeBugger)的GNU除錯工具。gdb是是一個用來除錯C和C++程式的偵錯程式,是一個互動式工具,工作在字元模式下。以下是gdb所提供的一些功能:
(1)設定斷點。
(2)監視程式變數的值。
(3)程式的單步執行。
(4)修改變數的值。
為了使gdb正常工作,必須使用-g選項編譯原始檔,使程式在編譯時包含除錯資訊。在命令列上鍵入gdb並按回車鍵就可以執行gdb。
進入gdb環境後,就可以輸入相應的命令對程式進行除錯。
(1)file:裝入想要除錯的可執行檔案。
(2)kill:終止正在除錯的程式。
(3)list:檢視指定檔案或者函式的原始碼,並標出行號。
(4)next:單步執行,但不進入函式內部。
(5)step:單步執行而且進入函式內部。
(6)run:執行當前被除錯的程式。
(7)quit:退出gdb環境。
(8)watch:監視一個變數的值而不管它何時被改變。
(9)print:檢視變數或表示式的值。
(10)break:在程式碼裡設定斷點,這將使程式執行到這裡時被掛起。
(11)make:不退出gdb就可以重新產生可執行檔案。
(12)Shell:不離開gdb就執行Shell命令。