理解GCC編譯流程 - Hello World

說(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 -o helloworld 使用 -o 參數(shù)
打印提示信息 gcc -Wall helloworld.c
打印編譯詳細(xì)信息 gcc -v helloworld.c

解析 gcc 編譯過(guò)程

gcc 編譯過(guò)程分為 預(yù)處理(預(yù)處理文件.i) -> 編譯(匯編文件.s) -> 匯編(目標(biāo)文件.o) -> 鏈接(可執(zhí)行文件.exe | a.out)

gcc 編譯

。gcc 默認(rèn)編譯命令只會(huì)生成可執(zhí)行文件,如果要生成中間文件 可以加 -save-temps 生成。如:gcc -save-temps helloworld.c -o helloworld 結(jié)果如圖所示:
image.png

接下來(lái)我們分別對(duì)這些文件加以說(shuō)明

預(yù)處理

gcc首先會(huì)做預(yù)處理,并生成預(yù)處理文件,文件后綴名為 .i
以下列出預(yù)處理會(huì)做的事情(當(dāng)然預(yù)處理做的事不止這些)。

  1. 頭文件展開(kāi) (不檢查語(yǔ)法錯(cuò)誤)
  2. 宏定義替換 (只做簡(jiǎn)單替換)
  3. 替換注釋 (空行代替注釋)
  4. 展開(kāi)條件編譯
    使用 -E 可以生成預(yù)處理文件,如下
gcc -E helloworld.c -o helloworld.i

編譯

編譯是把預(yù)處理文件編譯成匯編語(yǔ)言,文件后綴名為.s。
使用-S 生成匯編文件,如下

gcc -S helloworld.i -o helloworld.s

匯編內(nèi)容如圖


image.png

匯編

匯編過(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容