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為尾碼的檔,是經過預編譯的組合語言源代碼檔。