makefile寫法
規(guī)則
三要素:
- 目標(biāo)
- 依賴
- 命令
語法:
目標(biāo):依賴條件
命令
例子:
app:main.c add.c sub.c mul.c
gcc main.c add.c sub.c mul.c -o app
改進(jìn):
-
只是編譯修改的部分,是把編譯和鏈接分開執(zhí)行
app:main.o add.o sub.o mul.o gcc main.o add.o sub.o mul.o -o app main.o:main.c gcc -c main.c add.o:add.c gcc -c add.c mul.o:mul.c gcc -c mul.c sub.o:sub.c gcc -c sub.c
工作原理:
- 默認(rèn)只生成第一條規(guī)則
- 所以需要把最終的生成目標(biāo)寫在第一條
- 更新源文件時(shí),會(huì)比較目標(biāo)和依賴的時(shí)間關(guān)系,如果依賴比目標(biāo)還晚,就會(huì)重新執(zhí)行命令,
- 其中一個(gè)更新,會(huì)導(dǎo)致其他依賴此目標(biāo)的規(guī)則進(jìn)行執(zhí)行,最終導(dǎo)致最終的目標(biāo)被更新
變量:
- $< : 規(guī)則中第一個(gè)依賴
- $@ : 規(guī)則中的目標(biāo)
- $^ : 規(guī)則中所有的依賴
- 以上三個(gè)只能在命令中寫
- % : 模式規(guī)則,會(huì)做替換,比如用main,add來替換
- CC : 系統(tǒng)維護(hù)的變量 CC = cc = gcc
- CPPFLAGS : 預(yù)編譯(頭文件展開,宏替換,去掉注釋)的選項(xiàng)
- CFLAG : 編譯時(shí)的選項(xiàng) -L -g
- 全大寫是內(nèi)部維護(hù)變量
app:main.o add.o sub.o mul.o
gcc main.o add.o sub.o mul.o -o app
等價(jià)于 gcc $^ -o $@
obj=main.o add.o sub.o mul.o
target=app
CC = gcc
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
函數(shù):
- 一定有返回值
obj=main.o add.o sub.o mul.o
target=app
#獲取所有.c文件的函數(shù)wildcard,用$獲取返回值
src=$(wildcard ./*.c)
#把所有的.c替換成.o
obj=$(patsubst ./%.c, ./%.o, $(src))
CC = gcc
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
obj=main.o add.o sub.o mul.o
target=app
#獲取所有.c文件的函數(shù)wildcard,用$獲取返回值
src=$(wildcard ./*.c)
#把所有的.c替換成.o
obj=$(patsubst ./%.c, ./%.o, $(src))
CC = gcc
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
#偽目標(biāo),不會(huì)進(jìn)行更新時(shí)間的比較,防止在文件夾下有clean文件,導(dǎo)致clean無法執(zhí)行
.PHONYLclaen
clean:
#命令前面加上-意思是命令執(zhí)行錯(cuò)誤也繼續(xù)執(zhí)行
-mkdir /aa
rm $(obj) $(target)