ChatGPT 問答:
<aside> ❓ 請說明用 mask 指令執行 Makefile 和直接用 code editor 中的編譯器直接編譯有什麼區別。
使用 Makefile 和直接使用編譯器進行編譯之間有幾個主要區別:
總的來說,使用 Makefile 可以提高編譯過程的自動化程度和靈活性,並確保編譯過程的正確性和效率。因此,在大型項目中通常會使用 Makefile 來管理和執行編譯過程。
</aside>
簡而言之,使用 Makefile 可以在編譯上更有效率(直接控制要編譯什麼檔案)也更有彈性(可以自行設定參數)
變數(巨集)定義
減少冗於的撰寫。EX: OBJECTS= filea.o fileb.o filec.o
使用時在前面加 $() 的符號,如︰$(OBJECTS)
:=
該變數的值是根據它在 Makefile
中的位置決定的
?=
如果變數還沒被定義,則替它指定新的值 ; 若已經被定義則採原值
+=
將原本字串後面加上新的指令。亦即 CFLAGS 的值會變成 -Wall -g -O2
CFLAGS = -Wall -g
CFLAGS += -O2
<aside> 💡 注意事項 = 與 ?= 會延後至它們被使用時,才會被展開 := 則會立即展開右邊的值
</aside>
SHELL HACK 若你想在專案編譯之前,執行一些 shell 命令,可藉由 := 一開始便會被 make 執行的特性來達成
SHELL_HACK := $(shell mkdir -p BUILD)
目標:該專案所要建立的檔案,必須以 :
結尾。例:
foo.o: common.h
gcc -c foo.c
foo.o
是這個專案要建立的檔案; common.h
是相依性的項目/檔案; gcc -c foo.c
則為要產生這個項目所要執行的命令。