說(shuō)明
c 說(shuō)明
c++ 說(shuō)明
gcc 說(shuō)明
原文參考 http://www.gainstart.cn
本文主要介紹和記錄gcc編譯流程及原理。過(guò)多的概念和名詞這里就不做解釋。主要還是說(shuō)明gcc的編譯原理。
準(zhǔn)備
hello world C代碼編寫
首先我們先準(zhǔn)備 helloworld.c 源碼文件,內(nèi)容如下
#include<stdio.h>
int main(){
printf("hello world");
return 1;
}
gcc 簡(jiǎn)單使用
gcc helloworld.c
使用gcc helloworld.c命令 默認(rèn)在當(dāng)前目錄下生成 a.out 執(zhí)行文件,這時(shí)我們可以使用命令 ./a.out 執(zhí)行此文件
特別參數(shù)說(shuō)明
指定生成 可執(zhí)行文件名 gcc helloworld.c
-ohelloworld 使用-o參數(shù)
打印提示信息 gcc-Wallhelloworld.c
打印編譯詳細(xì)信息 gcc-vhelloworld.c
解析 gcc 編譯過(guò)程
gcc 編譯過(guò)程分為 預(yù)處理(預(yù)處理文件.i) -> 編譯(匯編文件.s) -> 匯編(目標(biāo)文件.o) -> 鏈接(可執(zhí)行文件.exe | a.out)

。gcc 默認(rèn)編譯命令只會(huì)生成可執(zhí)行文件,如果要生成中間文件 可以加
-save-temps 生成。如:gcc -save-temps helloworld.c -o helloworld 結(jié)果如圖所示:
接下來(lái)我們分別對(duì)這些文件加以說(shuō)明
預(yù)處理
gcc首先會(huì)做預(yù)處理,并生成預(yù)處理文件,文件后綴名為 .i。
以下列出預(yù)處理會(huì)做的事情(當(dāng)然預(yù)處理做的事不止這些)。
- 頭文件展開(kāi) (不檢查語(yǔ)法錯(cuò)誤)
- 宏定義替換 (只做簡(jiǎn)單替換)
- 替換注釋 (空行代替注釋)
- 展開(kāi)條件編譯
使用-E可以生成預(yù)處理文件,如下
gcc -E helloworld.c -o helloworld.i
編譯
編譯是把預(yù)處理文件編譯成匯編語(yǔ)言,文件后綴名為.s。
使用-S 生成匯編文件,如下
gcc -S helloworld.i -o helloworld.s
匯編內(nèi)容如圖

匯編
匯編過(guò)程是將匯編文件編譯成二進(jìn)制文件,文件后綴為.o
使用-c 可以生成二進(jìn)制文件,如下:
gcc -c helloworld.s -o helloworld.o
鏈接
鏈接過(guò)程是將二進(jìn)制文件鏈接成可執(zhí)行文件。
編譯時(shí)不用加任何參數(shù),如下:
gcc helloworld.o -o helloworld