Linux 是 C 語言的原生開發環境。本文引導初學者完成從撰寫原始碼、編譯連結到執行的完整流程,並解析 GCC 編譯器的關鍵參數與常見問題。
$ vi hello.c
輸入以下內容(按 i 進入插入模式,Esc 退出,:wq 存檔離開):
#include <stdio.h>
int main(void) {
printf("Hello Linux!\n");
return 0;
}
$ gcc hello.c -o hello
gcc:GNU Compiler Collectionhello.c:原始檔-o hello:指定輸出執行檔名稱(預設 a.out)$ ./hello
Hello Linux!
注意:必須加 ./ 指定當前目錄,因為 Linux 預設不搜尋當前目錄(安全機制)。
| 階段 | 指令 | 輸出 | 說明 |
|---|---|---|---|
| 前處理 | gcc -E hello.c -o hello.i | .i | 展開 #include、#define、條件編譯 |
| 編譯 | gcc -S hello.i -o hello.s | .s | 產生組合語言 |
| 組譯 | gcc -c hello.s -o hello.o | .o | 產生目標檔(機器碼,未連結) |
| 連結 | gcc hello.o -o hello | 執行檔 | 解析符號、連結庫、產生最終二進位 |
單指令 gcc hello.c -o hello 會自動執行上述四階段並清除中間檔。
| 參數 | 用途 | 範例 |
|---|---|---|
-Wall | 開啟所有常見警告 | gcc -Wall hello.c |
-Wextra | 額外警告 | gcc -Wall -Wextra hello.c |
-g | 產生除錯資訊 | gcc -g hello.c -o hello |
-O2 | 優化等級 2(發布建議) | gcc -O2 hello.c -o hello |
-std=c11 | 指定 C 標準 | gcc -std=c11 hello.c |
-I/path | 加入標頭檔搜尋路徑 | gcc -I../include hello.c |
-L/path -llib | 加入庫搜尋路徑與連結 | gcc -L../lib -lmylib hello.c |
# main.c
#include "math.h"
int main() { printf("%d\n", add(1,2)); }
// math.h
int add(int a, int b);
// math.c
#include "math.h"
int add(int a, int b) { return a + b; }
編譯方式一(單步):
$ gcc main.c math.c -o app
編譯方式二(分步,適合 Makefile):
$ gcc -c main.c -o main.o
$ gcc -c math.c -o math.o
$ gcc main.o math.o -o app
| 問題 | 原因 | 解決 |
|---|---|---|
command not found: gcc | 未安裝編譯器 | sudo apt install build-essential (Ubuntu/Debian) |
Permission denied | 執行檔無執行權限 | chmod +x hello 或重新編譯 |
undefined reference to | 缺少庫連結 | 加上 -l庫名 (如 -lm 連結數學庫) |
| 中文亂碼 | 終端機編碼不匹配 | 確保原始碼 UTF-8,終端機設定 UTF-8 |
# Makefile
CC = gcc
CFLAGS = -Wall -Wextra -g -O2
TARGET = hello
SRCS = hello.c
OBJS = $(SRCS:.c=.o)
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f $(OBJS) $(TARGET)
.PHONY: all clean
使用:make 建構,make clean 清理。
Linux 下 C 程式開發核心流程:vi → gcc → ./執行檔。掌握 GCC 四階段編譯模型、關鍵參數(-Wall -g -O2)、多檔案編譯與 Makefile 自動化,是 Linux 系統程式設計的必備基本功。建議搭配 GDB 除錯器(gcc -g + gdb ./hello)進一步提升開發效率。