makefile筆記-規(guī)則測試

以這個簡單的makefile文件為列

# 生成可執(zhí)行文件main
main:main.o
    cc -o main main.o
# 生成main.o對象文件
main.o:main.c
    cc -c main.c
# 清除指令,刪除執(zhí)行過程中生成的文件

# 偽目標(biāo)
.PHONY:clean

clean:
    rm main main.o

規(guī)則格式

target...:prerequisites...
<tab> command
  • target :目標(biāo)
  • prerequisites:依賴文件
  • command:命令

1.探究target和prerequisite的作用

  1. 執(zhí)行 make main.o
    • 運(yùn)行日志 cc -c main.c
    • 生成了main.o 文件
  2. 再次執(zhí)行make mian.o
    • 運(yùn)行日志'main.o' is up to date,已經(jīng)是最新了的
  3. 修改main.c文件后
    • 運(yùn)行日志 cc -c main.c
    • 生成了main.o 文件
  4. 修改makefile文件為
main.o:
    cc -c main.c
  1. 執(zhí)行 make mian.o
    • 運(yùn)行日志 cc -c main.c
    • 生成了main.o 文件
  2. 執(zhí)行 make mian.o
    • 運(yùn)行日志 cc -c main.c
    • 生成了main.o 文件
      6.修改makefile文件為
main:main.c
    cc -c main.c
  • 執(zhí)行結(jié)論和 4,5 的結(jié)果一樣

結(jié)論

  1. 當(dāng)target為目標(biāo)生成文件的名稱時(shí),makefile會將目標(biāo)名稱對應(yīng)的文件和依賴的文件進(jìn)行最后修改時(shí)間對比,來判斷是否需要執(zhí)行命令生成新的文件,避免重復(fù)執(zhí)行
  2. 不設(shè)置依賴文件或target名不是目標(biāo)文件名 ,不影響target指令的執(zhí)行

2.偽目標(biāo)的問題

一些博客上說偽目標(biāo)的做用是不生成目標(biāo)文件

以上面clean目標(biāo)為列

  • .PHONY:clean 代碼時(shí),執(zhí)行make clean
    • 執(zhí)行了刪除指令,沒有生成clean文件
  • 刪除.PHONY:clean代碼后,執(zhí)行命令,也沒有clean文件

結(jié)論

  1. 偽目標(biāo)沒有什么作用
  2. target名稱本身不會產(chǎn)生文件,不是目標(biāo)文件名時(shí),僅充當(dāng)方法名的作用

3.關(guān)于隱晦規(guī)則

  1. 刪除一下代碼
main.o:main.c
    cc -c main.c
  1. 執(zhí)行 make
    • 日志cc -c -o main.o main.c
    • 日志cc -o run main.o

結(jié)論
C 編譯過程中,有.o文件依賴時(shí),如果沒有顯性規(guī)則生成.o文件,makefile會自動補(bǔ)全.o 的生成命令


ps:如有問題 歡迎交流 愿與君共勉


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容