cd ~/work(或任意目錄)vi hello.c(或 nano、vim、gedit)#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}
:wq + Enter基本編譯:
gcc hello.c # 產生預設 a.out
./a.out # 執行
推薦編譯(指定輸出檔名 + 開啟所有警告):
gcc -Wall hello.c -o hello
./hello
-Wall:開啟常見警告(未使用變數、格式字串不符等),**強烈建議永遠加上**。-o hello:指定輸出執行檔名稱。$ ./hello
Hello, World!
呼叫 `libm:
#include <stdio.h>
#include <math.h>
int main(void) {
double x = 1.0;
printf("cos(1.0) = %f\n", cos(x));
return 0;
}
編譯命令:
gcc -Wall math_demo.c -o math_demo -lm
# ↑ ↑ ↑
# 警告 輸出檔 連結 libm(順序建議放最後)
原理:數學函數實作於 `libm.so`(通常在 `/lib` 或 `/usr/lib`),`-lm` 告訴連結器搜尋此庫。
| 選項 | 用途 |
|---|---|
-Wall | 開啟大多數警告 |
-Wextra | 額外警告(配合 -Wall) |
-O2 | 優化等級 2(釋出版建議) |
-g | 產生除錯資訊(配合 gdb) |
-std=c11 | 指定 C 標準(c99/c11/c17) |
-I/path | 加入頭檔搜尋路徑 |
-L/path | 加入庫搜尋路徑 |
-lname | 連結 libname.so/a |
# 分步編譯
gcc -Wall -c main.c -o main.o
gcc -Wall -c utils.c -o utils.o
gcc main.o utils.o -o myapp
# 或單行完成
gcc -Wall main.c utils.c -o myapp
gcc -g -Wall hello.c -o hello
gdb ./hello
(gdb) break main
(gdb) run
(gdb) next / step
(gdb) print var
(gdb) bt
(gdb) quit
| 現象 | 原因 | 解決 |
|---|---|---|
command not found: gcc | 未安裝或 PATH 未設定 | sudo apt install build-essential (Debian/Ubuntu) |
undefined reference to `cos' | 未連結數學庫 | 加上 -lm |
執行檔無法執行 Permission denied | 無執行權限 | chmod +x hello(GCC 通常自動給予) |
| 中文亂碼 | 終端機編碼非 UTF-8 | 設定終端機 UTF-8,原始碼存為 UTF-8 |