iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0

前情提要

[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 ,是必要的嗎? 他們的作用是什麼?
  • GNU make 常用參數 -j/-n/-k/-C/-f/-B/-s 的用途、使用場景

什麼事make clean

把建置產物(執行檔、.o/.d、build/ 等)清掉,讓工作區恢復乾淨,避免舊檔干擾,便於切換編譯選項或debug

什麼是 .PHONY

Make 會把目標名當作檔案名來比對時間戳。若你剛好有一個名叫 clean 或 run 的檔案存在,make clean/make run 會被判定「已最新」而不執行。
把它宣告成 .PHONY,Make 就不再把它視為檔案,比對時間戳的這套規則就不會套用,每次都會執行。

GNU make 常用參數 -j/-n/-k/-C/-f/-B/-s

-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(先切目錄再做)

  • 做什麼:在執行前先 cdDIR。可重複多次(逐層切)。

  • 怎麼用

    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 這類自訂開關控制。

上一篇
[Day 10] 有了makefile了? 那我們開始編譯吧!
系列文
30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言