makefile
好處 :
方便整個項目的管理
1.make
gcc - 編譯器 按照某種規則去編譯代碼
make - linux自帶的構建器
構建的規則在makefile中
2. makefile文件的命名
- makefile
- Makefile
3.makefile中的規則
gcc a.c b.c c.c -o app
- 三部分: 目標,依賴,命令
目標 app
依賴 a.c b.c c.c
命令 gcc a.c b.c c.c -o app
目標:依賴
(tab縮進) 命令
app:a.c b.c c.c
gcc a.c b.c c.c -o app
4.makefile的編寫
第一個版本
缺點:
效率低,修改一個文件,所有文件會被全部重新編譯
第二個版本
工作原理
依賴不存在
向下搜索子規則,如果有規則用來生成查找的依賴的,執行規則中的命令
依賴存在,判斷是否需要更新
原則:目標時間>依賴的時間
反之:則更新
缺點:冗余
第三個版本
-自定義變量:
obj=a.o b.o c.o (obj 變量名,可自行定義)
obj=10
變量的取值: aa=$(obj)
-makefile 自帶的變量: 大寫(格式都是大寫)
CPPFLAGS (指定頭文件)
CC
-自動變量
$@ : 規則中的目標
$< : 規則中的第一個依賴
$^ : 規則中所有的依賴
自動變量 只能在規則的命令中使用
模式匹配:
%.o:%.c
第一次:framwork.o沒有
main.o:main.c
gcc -c main.c -o main.o
第二次: add.o
add.o:add.c
gcc -c add.c -o add.o
缺點: 可移植性比較差
第四個版本
*makefile所有的函數都有返回值
*查找指定目錄下指定類型的文件
src = $(wildcard ./*.c)
*匹配替換
obj = $(patsubst %.c, %.o, $(src))
缺點:不能清理項目
第五個版本
讓make生成不是終極目標的目標
make 目標名
編寫一個清理項目的規則
clean:
rm *.o app
-(符號) 作用:忽略執行失敗的命令,讓程序繼續向下執行。
當前語句執行失敗后, 繼續向下執行
- rm $(obj) $(out) -f
聲明偽目標 跳過判斷環節,直接執行
.PHONY: 生成的偽目標名
.PHONY: clean
-f 強制執行
命令前加 -
忽略執行失敗的命令,繼續執行
.PHONY: clean
clean:
-rm -f $(obj) $(out)
