1. 程式人生 > 其它 >GCC編譯的4個階段

GCC編譯的4個階段

技術標籤:Linux

GCC編譯一共有4個階段:預處理、編譯、彙編、連結
gcc指令的一般格式

gcc [選項] 要編譯的檔案 [選項] [輸出檔案]
選項說明
-E預處理原始檔
-S編譯為彙編程式碼
-c編譯為目標檔案
-o outfile指定輸出檔案的檔名

eg:下面是一段很簡單的hello.c程式碼,以這段程式碼為例。

#include <stdio.h>
#define NAME "mao"
void main(){
 printf("hello:%s\n",NAME);
}

1、預處理階段
預處理階段主要工作是標頭檔案的展開、巨集定義的替換。

對於上面的程式碼#include <stdio.h>表示引入標頭檔案,在預處理階段stdio.h檔案就會被載入到我的hello.c中;而對於在程式碼中使用到的NAME,就會被替換成該巨集所定義的真實內容"mao"。可以使用下面的命令執行預處理:生成.i檔案

gcc -E hello.c -o hello.i

在這裡插入圖片描述

2、編譯階段
gcc在編譯階段會進行程式碼規範性檢查、語法錯誤檢查,如果通過就會生成.s彙編檔案(彙編程式碼)

gcc -S hello.i -o hello.s

在這裡插入圖片描述
3、彙編階段
把 .s 檔案翻譯成二進位制.o檔案(目標檔案)

gcc -c hello.s -o hello.o

在這裡插入圖片描述
4、連結階段
彙編階段將程式碼編譯成了二進位制檔案,還需要和系統其他元件(比如標準庫、動態連結庫等)結合起來才能正常執行,比如呼叫print函式列印,在預處理階段也只是將“stdio.h”標頭檔案中的申明引入進來,沒有函式的實現,那怎麼呼叫它的呢?這就是連結的工作了,連結之前的操作都是對一個檔案進行處理,而連結可以看作是對多個檔案進行“打包”的過程,它將所有的目標檔案以及系統元件組合成一個可執行檔案。

gcc hello.o -o hello

在這裡插入圖片描述