以這個簡單的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的作用
- 執(zhí)行
make main.o
- 運(yùn)行日志
cc -c main.c
- 生成了main.o 文件
- 運(yùn)行日志
- 再次執(zhí)行
make mian.o
- 運(yùn)行日志
'main.o' is up to date
,已經(jīng)是最新了的
- 運(yùn)行日志
- 修改main.c文件后
- 運(yùn)行日志
cc -c main.c
- 生成了main.o 文件
- 運(yùn)行日志
- 修改makefile文件為
main.o:
cc -c main.c
- 執(zhí)行
make mian.o
- 運(yùn)行日志
cc -c main.c
- 生成了main.o 文件
- 運(yùn)行日志
- 執(zhí)行
make mian.o
- 運(yùn)行日志
cc -c main.c
- 生成了main.o 文件
6.修改makefile文件為
- 運(yùn)行日志
main:main.c
cc -c main.c
- 執(zhí)行結(jié)論和 4,5 的結(jié)果一樣
結(jié)論
- 當(dāng)target為目標(biāo)生成文件的名稱時(shí),makefile會將目標(biāo)名稱對應(yīng)的文件和依賴的文件進(jìn)行最后修改時(shí)間對比,來判斷是否需要執(zhí)行命令生成新的文件,避免重復(fù)執(zhí)行
- 不設(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é)論
- 偽目標(biāo)沒有什么作用
- target名稱本身不會產(chǎn)生文件,不是目標(biāo)文件名時(shí),僅充當(dāng)方法名的作用
3.關(guān)于隱晦規(guī)則
- 刪除一下代碼
main.o:main.c
cc -c main.c
- 執(zhí)行 make
- 日志
cc -c -o main.o main.c
- 日志
cc -o run main.o
- 日志
結(jié)論
C 編譯過程中,有.o文件依賴時(shí),如果沒有顯性規(guī)則生成.o文件,makefile會自動補(bǔ)全.o 的生成命令