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()
等函式。