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

C 語言開發環境從零開始:GCC 編譯四階段、常用參數與分步建構實戰

     編輯:關於C語言
 

脫離 IDE,在 Linux 終端機掌握 GCC 編譯鏈全貌,是深入理解 C 程式建構過程的最佳途徑。本文以實戰範例拆解 GCC 四大階段、核心參數與分步編譯技巧。

四大核心工具鏈

工具角色常見選擇
編輯器撰寫原始碼Vim, Emacs, VS Code, Sublime Text
編譯器原始碼 → 機器碼GCC (GNU Compiler Collection)
除錯器運行時檢查GDB (GNU Debugger)
建構工具自動化依賴與編譯Make / CMake

IDE 只是將上述四者整合圖形化;掌握命令列操作能讓你在無圖形介面的伺服器/嵌入式環境也能自如開發。

GCC 編譯四階段詳解

  1. 預處理:展開宏、包含標頭檔、條件編譯 → 產出 .i 檔。
  2. 編譯:.i → 組合語言 .s。
  3. 組譯:.s → 目的檔 .o(機器碼,含符號表、重定位資訊)。
  4. 連結:一或多個 .o + 函式庫 → 執行檔(ELF 格式)。

常用 GCC 參數速查

參數作用範例
-E僅預處理,輸出 .igcc -E test.c -o test.i
-S編譯至組語,輸出 .sgcc -S test.i -o test.s
-c編譯+組譯至 .o,不連結gcc -c test.c -o test.o
-o file指定輸出檔名gcc test.c -o test
-g嵌入除錯資訊(給 GDB 用)gcc -g test.c -o test
-O0/-O1/-O2/-O3最佳化等級(預設 O2)gcc -O2 test.c -o test
-static靜態連結gcc -static test.c -o test
-shared產生動態庫gcc -shared -fPIC lib.c -o lib.so
-Wall -Wextra開啟常見警告gcc -Wall -Wextra test.c
-std=c11指定 C 標準gcc -std=c11 test.c

實戰:從 Hello World 到分步建構

原始碼 gcctest.c

#include 
int main(void) {
    printf("This is a gcc test!\n");
    return 0;
}

一鍵編譯執行

$ gcc gcctest.c -o gcctest
$ ./gcctest
This is a gcc test!

分步產出中間檔案

# 1. 預處理
$ gcc -E gcctest.c -o gcctest.i

# 2. 編譯為組語
$ gcc -S gcctest.i -o gcctest.s

# 3. 組譯為目的檔
$ gcc -c gcctest.s -o gcctest.o
# 或直接從 .c
$ gcc -c gcctest.c -o gcctest.o

# 4. 連結生成執行檔
$ gcc gcctest.o -o gcctest
# 或用 ld 手動連結(需指定啟動檔、libc 路徑)
$ ld gcctest.o -o gcctest

觀察中間檔案關鍵內容

  • .i:展開後的完整原始碼(含 stdio.h 內容),龐大。
  • .s:x86-64 組語,可見 main:、call puts、堆疊框架建立/銷毀指令。
  • .o:ELF 目的檔,objdump -d gcctest.o 可反組譯檢視。

進階技巧

  • 保留中間檔:gcc -save-temps test.c 自動留存 .i/.s/.o。
  • 查看預定義宏:gcc -dM -E - < /dev/null。
  • 靜態分析:gcc -fanalyzer test.c(GCC 10+)。
  • 交叉編譯:aarch64-linux-gnu-gcc test.c -o test_arm64。
 
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved