GCC編譯過程
- 一個C/C++文件要經過預處理(preprocessing)、編譯(compilation)、匯編(assembly)、和連接(linking)才能變成可執行文件。
gcc的常用選項
-E 只預處理,不會編譯、匯編、鏈接
-S 編譯到匯編語言不進行匯編和鏈接
-c 編譯和匯編,不會鏈接
-o 指定輸出文件名為file,這個名稱不能跟源文件名同名
-static 此選項對生成的文件采用靜態鏈接
-g 生成調試信息,GNU調試器可利用該信息。
-share 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫.
-O0
-O1
-O2
-O3 編譯器的優化選項的4個級別,-O0表示沒有優化-O1為缺省值,-O3優化級別最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息.
以hello.c為例:
#include <stdio.h> #define MAX 20 #define MIN 10 #define _DEBUG #define SetBit(x) (1<<x) int main(int argc, char* argv[]) { printf("Hello World \n"); printf("MAX = %d,MIN = %d,MAX + MIN = %d\n",MAX,MIN,MAX + MIN); #ifdef _DEBUG printf("SetBit(5) = %d,SetBit(6) = %d\n",SetBit(5),SetBit(6)); printf("SetBit( SetBit(2) ) = %d\n",SetBit( SetBit(2) )); #endif return 0; }
預處理
- 預處理就是將要包含(include)的文件插入原文件中、將宏定義展開、根據條件編譯命令選擇要使用的代碼,最后將這些代碼輸出到一個“.i”文件中等待進一步處理。
命令為:
gcc -E -o hello.i hello.c
編譯
- 編譯就是把C/C++代碼(比如上面的".i"文件)“翻譯”成匯編代碼。
命令是:
gcc -S -o hello.s hello.i
匯編
- 匯編就是將第二步輸出的匯編代碼翻譯成符合一定格式的機器代碼,在Linux系統上一般表現位ELF目標文件(OBJ文件)。
命令是:
gcc -c -o hello.o hello.s
鏈接
- 鏈接就是將匯編生成的OBJ文件、系統庫的OBJ文件、庫文件鏈接起來,最終生成可以在特定平台運行的可執行程序。
命令是:
gcc -o hello hello.o
總結:
在編譯過程中。除非使用了"-c",“-S”,或"-E"選項(或者編譯錯誤阻止了完整的過程),否則統一完整鏈接步驟。
譬如:gcc hello.c 和gcc -o hello hello.c都已經完成鏈接操作。