1. 程式人生 > >C語言gcc處理過程

C語言gcc處理過程

 

gcc編譯C檔案一共四步,預處理(Preprocess),編譯(Compilation),彙編(Assembly)和連結(Linking)

 1. 預處理(Preprocess)

            預處理是預處理中會展開以#起始的行,包括#if、#ifdef、#if ndef、 #else 、 #elif 、 # endif、#define、#include、#line、 #error、#pragma以及單獨的#。其實就是把除了函式(包括main)以外的東西都展開成指定的形式,比如加上行號等,並將標頭檔案裡包含的東西所對應的檔案(包括子資料夾)也都寫入進去以便呼叫。同時也會把寫在檔案裡的註釋都刪掉。

gcc -E text.c -o text.i

    -E是僅啟用預處理程式,將生成的資訊放入text.i。如果不寫 -o text.i 就會生成到終端顯示。相當於重定向。 

2. 編譯(compilation)

        編譯的作用就是把預處理完的檔案進行一系列語法分析及優化後生成相應的彙編檔案。

gcc -S text.c -o text.s

 3. 彙編(Assembly)

        彙編就是把生成的彙編指令逐條翻譯成機器可以識別的形式,即機器碼,這一步會產生平臺相關性,即決定了在哪種平臺下執行。

gcc -c text.s -o text.o

.o檔案是目標檔案型別。

 

4. 連結(Linking)

        這是最後一步,將生成的目標檔案和其所依賴的庫檔案進行連線,生成一個可執行檔案。連結的細節方面可以參考CSAPP的第七章,很詳細,包括可執行目標檔案和重定位目標檔案的區別等。

gcc text.o -o text.out

5.執行程式

  輸入    ./text.out  執行c程式

一步gcc編譯C檔案:

gcc text.c -o text -I ./ 
./text

或者這樣 

gcc text.c -o text.o
./text.o

  

 如上 -o選項就是連結,後面加上生成的可執行檔案的名字,不輸入預設為 a.out 。所有步驟都隱式被悄悄搞定了,生成的檔案用完都刪掉了。-I 選項後面加上text.h 的路徑,即告訴編譯器在這個目錄下找標頭檔案,因為在 text.c 中用到了 text.h 。如果它們在同一個目錄下是可以省略的。