GCC編譯的四個階段

2021-10-18 10:49:19 字數 1237 閱讀 9350

gcc編譯流程分為4個步驟,分別為:

預處理(pre-processing)

編譯(compiling)

彙編(assembling)

鏈結(linking)

(1)預處理階段

在該階段,編譯器將上述**中的stdio.h編譯進來,並且使用者可以使用gcc的選項「-e」進行檢視,該選項的作用是把源**進行預處理。

預處理器根據以字元#開頭的命令(directives),修改原始的c程式。如helloworld.c中的#include 指令告訴預處理器讀系統標頭檔案stdio.h的內容,並把它直接插入到程式文字中去。結果得到乙個c程式,通常是以.i作為副檔名的。

(2)編譯階段

接下來進行的是編譯階段,在這個階段中,gcc首先要檢查**的規範性、是否有語法錯誤等,以確定**實際要做的工作,在檢查無誤後,gcc把**編譯成彙編**。使用者可以使用「-s」選項來進行檢視,該選項生成彙編**。組合語言是非常有用的,它為不同高階語言不同編譯器提供了通用語言。如:c編譯器和fortran編譯器產生的輸出檔案都是一樣的組合語言。

(3)彙編階段

彙編階段是把編譯階段生成的「.s」檔案轉化成目標檔案,讀者可以使用選項「-c」把彙編**轉化為「.o」的二進位制目標**

(4)鏈結階段

我們以hello.c 作為描述:

#include int main()
在這段程式中並沒有定義「printf」的函式實現,且在預編譯中包含進去的「stdio.h」中也只有該函式的宣告,而沒有定義函式的實現,那麼是在**實現的「printf」函式的呢?

答案是:系統把這些函式實現都做到了名為libc.so.6的庫檔案中去了,在沒有特別指定時,gcc會到系統預設的搜尋路徑「/usr/lib」下進行查詢,也就是鏈結到libc.so.6庫函式中去,這樣就能實現函式「printf」了,而這也就是鏈結的作用。

函式庫一般分為靜態庫和動態庫兩種。靜態庫是指在編譯鏈結時,把庫檔案的**全部加入到可執行檔案中,因此生成的檔案比較大,但在執行時也就不需要庫檔案了,其字尾一般為「.a」。動態庫與之相反,在編譯鏈結時並沒有把庫檔案的**加入到可執行檔案中,而是在程式執行時鏈結檔案載入庫,這樣就可以節省系統的開銷,動態庫一般字尾名為「.so」,如前面所述的libc.so.6就是動態庫。gcc在編譯時預設使用動態庫。

完成了鏈結之後,gcc就可以生成可執行檔案了。

gcc編譯的四個階段

gcc編譯的四個階段 如下圖 e preprocess only do not compile,assemble or link 只預處理,不會編譯 彙編 鏈結 s compile only do not assemble or link 只編譯,不會彙編 鏈結 c compile and asse...

GCC編譯程式時的四個階段說明!

在使用gcc進行程式的編譯時通常要經歷四個階段 通常指的是從源程式到可執行的二進位制 這整個過程 一些以hello.c為例來說明這四個階段。hello.c includeint main gcc的四個階段如下 1.預處理階段 2.編譯階段 3.彙編階段 4.鏈結階段 四個階段的詳細資訊如下 1.預處...

程式編譯的四個階段

預處理將標頭檔案展開,將巨集定義替換,生成符號檔案.s 編譯則包含了詞法檢查,語法檢查,許可權檢查,優化 組裝 將編譯後的 組裝成機器碼,形成位置無關的目標檔案 o 鏈結將多個位置無關的目標檔案合併成可執行檔案 可見組裝才是平台相關的,之前的操作都與平台無關,換句話說是編譯前端和編譯後端 乙個類的成...