1. 程式人生 > >基於Linux的C程式設計(一)

基於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命令。