C/C++ 源代碼經過 預處理 → 編譯 → 匯編 → 鏈接 四大階段,生成可執行文件。每階段產出中間產物,理解此流程有助於診斷構建錯誤、優化編譯速度、掌握靜態/動態鏈接機制。
處理以 # 開頭的預處理指令,產出 .i / .ii 文件(無宏、無註釋、展開頭文件)。
#define 替換,#undef 取消#if/#ifdef/#ifndef/#else/#elif/#endif 根據宏決定保留代碼#include <sys> 系統路徑,#include "user" 當前目錄,遞歸展開__LINE__、__FILE__、__func__、__DATE__、__TIME__ 替換//、多行 /* */命令:gcc -E hello.c -o hello.i
詞法/語法/語義分析,優化,生成 匯編代碼 .s。
命令:gcc -S hello.i -o hello.s
將匯編助記符翻譯為 機器指令,生成 目標文件 .o / .obj(ELF/COFF/PE 格式)。
命令:gcc -c hello.s -o hello.o
將多個目標文件與庫文件合併,解決符號引用,生成 可執行文件。
.a / .lib 靜態庫**提取**被引用的目標模塊,**複製**到可執行文件.so / .dll 名稱及符號索引crt1.o、crti.o、crtn.o-s 剥離符號、-Os 體積優化、-ffunction-sections -fdata-sections -Wl,--gc-sections 刪除未用節區、靜態鏈接 musl libc 可至 ~5KB# 編譯+鏈接一步到位 gcc hello.c -o hello # 查看中間產物 gcc -E hello.c -o hello.i # 預處理 gcc -S hello.i -o hello.s # 編譯 gcc -c hello.s -o hello.o # 匯編 gcc hello.o -o hello # 鏈接 # 靜態鏈接 gcc hello.c -static -o hello_static # 動態鏈接顯式指定 gcc hello.c -shared -fPIC -o libhello.so gcc main.c -L. -lhello -o main -Wl,-rpath=.