makefile命名规则:
makefile/Makefile
makefile三要素:
目标 依赖 规则命令
第一版
app:main.c add.c sub.c
gcc -o app-I./include main.c add.c sub.c
更改其中一个文件,所有源码都要重新编译
依赖文件如果比目标文件新,则重新生成目标
第二版:
#objFiles 定义目标文件
objFiles=main.o add.o sub.o
#目标文件用法 $(Var)
app:$(objFiles)
gcc -o app -I./include main.o add.o sub.o
main.o:main.c
gcc -c main.c -I ./include
add.o:add.c
gcc -c add.c -I ./include
sub.o:sub.c
gcc -c sub.c -I ./include
makefile的隐含规则:默认处理第一个目标
函数:
wildcard可以进行文件匹配
patsubst内容的替换
makefile的变量:
$@代表目标
$^代表全部依赖
$<第一个依赖
$?第一个变化的依赖
第三版:
#get all .c files
Srcfile=$(wildcard *.c)
#all .c files --> .o files
objFiles=$(patsubst %.c,%.o,$(SrcFiles))
#目标文件用法 $(Var)
app:$(objFiles)
gcc -o app -I./include $(ObjFiles)
%.o:%.c
gcc -c $< -I./include -o $@
test:
echo $(SrcFiles)
echo $(objFiles1)
clean:
rm *.o
rm app
@在规则前代表不输出该条规则的命令
规则前的"-"代表该条规则报错仍然执行
第四版:
#get all .c files
Srcfile=$(wildcard *.c)
#all .c files --> .o files
objFiles=$(patsubst %.c,%.o,$(SrcFiles))
all:app app1
#目标文件用法 $(Var)
app:$(objFiles)
gcc -o $@ -I./include $(ObjFiles)
app1:$(objFiles)
gcc -o $@ -I./include $(ObjFiles)
#模式匹配规则,$@,$<这样的变量,只能在规则中出现
%.o:%.c
gcc -c $< -I./include -o $@
test:
@echo $(SrcFiles)
@echo $(objFiles1)
#定义伪目标,防止有歧义
.PHONY:clean all
clean:
-@rm -f *.o
-@rm -f app app1