gcc 基本語法與其用途
昨天的文章 (我是傳送門) 學會了使用gcc編譯檔案,產生可以在WSL上面運行的執行檔,接下來,會來介紹幾個gcc常用的語法。
對了,結果我昨天查了一下,其實網路上就有蠻多大神在寫This is fine. ASCII art ....
https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
開始導讀 ↑ 前我們需要先理解 gcc的編譯過程,這樣才可以更好理解上面網址裡面的內容。
一般來說,gcc編譯的流程分為 4 步驟
#include、#define → 得到 .i
.i 翻譯成組合語言 → 得到 .s
.s 轉成二進位的目標檔 → 得到 .o
.o 檔和函式庫合併 → 最終 執行檔 (預設名稱會是a.out).c:人類寫的程式.i:展開 include & 巨集後的程式.s:組合語言.o:機器碼(中間產物)a.out:最終執行檔我們現在來回到這邊
https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
主要講編譯的方法,可以分成3種
-c (只編譯不連結)
.c 檔編譯成 目標檔 .o,但不會產生執行檔.c 編譯成 .o,最後再一起連結gcc -c main.c # 產生 main.o
gcc -c dog_meme.c # 產生 dog_meme.o
gcc main.o dog_meme.o -o dog_meme
-o file (輸出檔案名稱)
a.out (也可以像下面依樣用-o指定成main)gcc main.c -o main
gcc main.c
-v (顯示詳細編譯過程)
gcc -v main.c -o main
-Wall (開啟大部分警告)
-Wextra (更多警告)
-Wall 更嚴格,例如未使用的參數、隱含型別轉換-Werror (把警告當錯誤)gcc -Wall -Wextra -Werror main.c -o main
-ggdb-g (生成除錯資訊,配合 gdb)
gcc -g main.c -o main gdb ./main
-ggdb (針對 gdb 的最佳除錯資訊)
-g 更完整,包含 gdb 專用的資訊-ggdb,比單純 -g 好-O2-O0 (不最佳化,除錯時用)
-O0
-O2 (常用平衡版最佳化)
-O3 (速度最大化)
-Os (縮小體積)
-llib.a 或 .so)gcc main.c -L/usr/local/lib -lmylib -o main
-llib (連結函式庫)-lxxx → 代表 libxxx.a 或 libxxx.so。gcc main.c -lm -o main-lm 代表連結數學函式庫 libm,才能用 sqrt()、sin() 等函式。