Linux GCC 編譯4個過程

首先,GCC使用預處理程式cpp,由它負責展開在原始檔案中定義的巨集,預編譯語句(如巨集定義define等、其中插入“#include”語句所包含的內容)進行分析向;接著,GCC會使用ccl和as將處理後的原始碼編譯成目標碼(組語);最後,GCC會調用鏈結程式ld,把生成的目標代碼鏈結成一可執行程式.

◆ 預處理(Pre-Processing)
    -E 預處理完成後停止編譯 # gcc -E hello.c -o hello.cpp

◆ 編譯(Compiling)
◆ 彙編(Assembling)
◆ 鏈結(Linking)

當所有的目標檔都生成之後,gcc就使用 ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標檔被安排在可執行程式中的恰當的位置,同時,該程式所使用到的函數也從各自所在的函式庫中連到合適的地方。

gcc主要參數:

-c 只編譯生成.o,不連接 -o 定義輸出檔

-g gdb調試用,在可執行程式中包含標準測試資訊

-IDIRNAME 將DIRNAME加入到包含檔的搜索目錄中去

-LDIRNAME 將DIRNAME加入到庫檔檔的搜索目錄中去 -x 指定編譯步驟

-O,O1,O2,O3,O4,O5 優化級別

-w 關閉所有警告

-Wall 允許所有有用的警告

-DFOO=BAR 定義預處理宏FOO的值為BAR

-static 靜態程式庫

-lFOO 動態函式庫,名為libFOO.o/libFOO.so(2.4/2.6)

-mcpu=CPU TYPE 針對不同CPU作不同的優化,比如-m386,-mpentiumpro


.c為尾碼的檔,C語言原始碼檔;

.a為尾碼的檔,是由目標檔構成的檔案庫檔;

.C,.cc或.cxx 為尾碼的文件,是C++原始碼文件;

.h為尾碼的檔,是程式所包含的頭檔;

.i 為尾碼的檔,是已經預處理過的C原始碼檔;

.ii為尾碼的檔,是已經預處理過的C++原始碼檔;

.m為尾碼的文件,是Objective-C 原始碼文件;

.o為尾碼的檔,是編譯後的目標檔;

.s為尾碼的文件,是組合語言原始碼文件;經過預編譯跟編彙後產生.o的目標檔

.S為尾碼的檔,是經過預編譯的組合語言源代碼檔。