[Day 10] 有了makefile了? 那我們開始編譯吧! - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
在前面的章節中我們學會寫makefile
→ 在prompt 端下指令:make
/make build_simple
/make build_c11
產生相對應的執行檔:dog_meme
/ dog_meme_with_h
/dog_meme_without_h
如果要執行執行檔的話
就在下make run
/make run run_build_simple
/make run day03_single
就可以執行出想要的結果了
make clean
和 .PHONY
,是必要的嗎? 他們的作用是什麼?-j/-n/-k/-C/-f/-B/-s
的用途、使用場景把建置產物(執行檔、.o/.d、build/ 等)清掉,讓工作區恢復乾淨,避免舊檔干擾,便於切換編譯選項或debug
Make 會把目標名當作檔案名來比對時間戳。若你剛好有一個名叫 clean 或 run 的檔案存在,make clean/make run 會被判定「已最新」而不執行。
把它宣告成 .PHONY,Make 就不再把它視為檔案,比對時間戳的這套規則就不會套用,每次都會執行。
-j [N]
= --jobs[=N]
(平行編譯)做什麼:同時跑多個目標;N
是工作數。省略 N
會讓 make 盡量跑很多工作(等同「不設上限」)。
怎麼用:
make -j8 # 用 8 執行緒 make -j # 盡可能多(可能把機器跑滿)
地雷:規則需「平行安全」(不可同時寫同一個檔)。若有問題,可暫時用 .NOTPARALLEL:
或去掉 -j
。
-n
= --just-print
/ --dry-run
(只顯示、不執行)make -n all
-j
也只會「列印並行排程的命令」,不會真的跑。-k
= --keep-going
(遇錯不停)make -k all
-C DIR
= --directory=DIR
(先切目錄再做)做什麼:在執行前先 cd
到 DIR
。可重複多次(逐層切)。
怎麼用:
make -C src make -C build -f ../Makefile
小註:遞迴建置常搭配 $(MAKE)
使用;$(MAKE)
會自動傳遞目前的 flags(如 -j
)。
-f FILE
= --file=FILE
/ --makefile=FILE
(指定 Makefile)做什麼:用指定檔案而非預設的 Makefile
/makefile
。
怎麼用:
make -f Makefile.debug make -f base.mk -f local.mk # 可指定多個,後面的可覆寫前面
-B
= --always-make
(強制重建)make -B
make clean && make
;-B
適合快速驗證規則是否正確。-s
= --silent
/ --quiet
(靜音)@
)。make -s all
V=1
這類自訂開關控制。