首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言編譯原理全流程圖解:預處理、編譯、匯編、鏈接

     編輯:關於C

編譯四階段流程圖

編譯流程圖

1. 預處理

gcc -E file.c -o hello.i
  • 處理 #include、#define、#ifdef 等指令。
  • 展開頭文件、宏替換、條件編譯。
  • 輸出 .i 檔(純 C 代碼,無預處理指令)。
  • #pragma 指導編譯器狀態/特定動作。

2. 編譯

gcc -S file.c -o hello.S
  • 詞法分析:識別關鍵字、標識符、字面量。
  • 語法分析:構建語法樹,檢查語法規則。
  • 語義分析:類型檢查、作用域解析。
  • 優化並生成匯編代碼 .S(文本格式)。

3. 匯編

gcc -c hello.S -o hello.o
  • 將匯編指令一對一翻譯為機器指令(二進制目標文件 .o)。
  • 符號表、重定位表生成。

4. 鏈接

靜態鏈接:

  • .o + .a(靜態庫) → 可執行文件。
  • 庫代碼複製進可執行文件,體積大、佔內存、多進程重複載入浪費。
  • 以空間換時間,啟動快。

靜態鏈接

動態鏈接:

  • .o + .so(動態庫) → 可執行文件(含動態庫引用)。
  • 運行時由動態鏈接器載入共享庫,多進程共用一份庫代碼。
  • 以時間換空間,啟動稍慢、體積小、便於升級。

動態鏈接

總結對比

項目靜態鏈接動態鏈接
時機編譯期運行期
庫文件.a.so / .dll
可執行文件體積大小
內存佔用大(重複載入)小(共享)
啟動速度快稍慢
庫升級需重新鏈接替換 .so 即可

關鍵命令速查


gcc -E file.c -o hello.i   # 僅預處理
gcc -S file.c -o hello.S   # 編譯至匯編
gcc -c hello.S -o hello.o  # 匯編至目標文件
gcc hello.o -o hello       # 鏈接生成可執行文件
gcc file.c -o hello        # 一步到位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved