1. 程式人生 > >linux應用程式設計--GCC程式編譯

linux應用程式設計--GCC程式編譯

GCC程式編譯

linux系統下的GCC(GNU C Compiler)是GNU推出的功能強大、效能優越的多平臺編譯器,是GNU的代表作之一。GCC可以在多種硬體平臺上編譯出可執行程式,其執行效率與一般的編譯器相比,平均效率要高20%~30%。

GCC編譯程式的四個階段

  1. 預處理(Pre-Processing):編譯器將C程式的標頭檔案編譯進來,還有完成巨集的替換。
  2. 編譯(Compiling):這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無誤後,將程式編譯成組合語言。
  3. 彙編(Assembling):將彙編程式翻譯成機器語言,也就是二進位制程式。
  4. 連結(Linking):連結標頭檔案中的函式所對應的函式庫。例如:printf函式在stdio.h標頭檔案中只是完成宣告,要實現printf函式的功能,還需要連結到實際實現程式碼中去。

GCC通過後綴來區分輸入檔案的類別

.c

C語言原始碼檔案

.a

是由目標檔案構成的庫檔案

.C,.cc或.cxx

C++原始碼檔案

.h

標頭檔案

.i

已預處理過的C原始碼檔案

.ii

已預處理過的C++原始碼檔案

.o

編譯後的目標檔案

.s

組合語言原始碼檔案

.S

經過預編譯的組合語言原始碼檔案

GCC用法

    gcc [options] [filenames]

    options : 編譯器所需要的編譯選項

    filenames : 要編譯的檔名

    編譯選項

    -o output_filename : 確定可執行檔案的名稱,如果不新增該選項,則給出預設執行檔案xxx.out

    -c : 只編譯,不連結成為可執行檔案,生成.o目標檔案

  

    -g : 產生除錯工具(GNU的GDB)所必要的除錯資訊

    -O : 對程式進行優化編譯、連結,產生的可執行檔案的執行效率可以提高,但是編譯、連結速度會降低

    -O2 : 比-O更好的優化編譯、連結

    -I dirname : 將dirname所指出的目錄加入到程式標頭檔案目錄列表中

    C程式中的標頭檔案包含兩種情況:

    #include <A.h>

    #include "B.h"

    對於<>,預處理程式cpp在系統預設的標頭檔案目錄中搜尋相應的檔案

    對於"",cpp在當前目錄中搜尋標頭檔案,如果新增-I選項,並且在當前目錄中沒有找到需要的檔案,就到指定的dirname目錄中去尋找。

 -L dirname : 將dirname所指定的目錄加入到庫檔案的目錄列表中。在預設情況下,連線程式ld在系統的預設路徑中(/user/lib)尋找所需要的庫檔案,這個選項告訴連結程式,首先到-L指定的目錄中去尋找,然後再到系統預設路徑中尋找。

 -lname : 在連線時,裝載名字為libname.a的函式庫,該函式庫的目錄可以是系統預設或者由-L選項指定。

 -static : 靜態連結庫檔案。當使用靜態庫時,連結器找出程式所需的函式,然後將它們拷貝到可執行檔案中,此後將不需要靜態程式庫,但是靜態連結佔用空間大,所以linux下進行連結的預設操作是連結動態庫。

 -Wall : 生成所有警告資訊

 -w : 不生成任何警告資訊

 -DMACRO : 定義MACRO巨集,等效於在程式中使用#define MACRO