Makefile(1)
app:main.c add.c sub.c mul.c
gcc main.c add.c sub.c mul.c -o app
- 格式为:目标:依赖 \n\t命令
- 意义就是将gcc命令搬到makefile中
Makefile(2)
- 由于Makefile(1)每次make都需要编译所有文件,耗时。所以每次有文件修改了只需要编译所改动的文件生成对应的.o文件,然后make自动进行链接即可
app:main.o add.o mul.o
gcc main.o add.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
- 第一次编译会生成所有的.o,然后有文件更新的话,make只需要通过文件的时间戳来判断然后只编译改动的文件
- 过程:先看gcc第一层依赖,如果还没有便向下查找依赖, 递归编译最终得到最后的目标
Makefile(3)
- 我们看到Makefile(2)很多文本冗余,如第一二行相同内容,后三个模块格式基本一致。所以可以采用makefile中的变量和格式
- 变量直接用=赋值,${v_name}(括号也行)来取变量值
- 常见模式规则:
- %匹配多个字符,表示相同的一部分内容
- $<:表示规则中的第一个依赖
- $@:表示规则中的目标
- $^:表示规则中的所有依赖
obj = main.o add.o sub.o mul.o
target = app
${target}:${obj}
gcc $^ -o ${target}
%.o:%.c
gcc -c $< -o $@
- 有些系统变量可以赋值,比如CC(gcc), CPPFLAGS
Makefile(4)
- makefile提供一些函数供使用,格式:v_nane = $(funname param1, param2…)
target = app
src = $(wildcard ./*.c)
obj = $(patsubst %.c, %.o, $(src))
$(target):$(obj)
gcc $^ -o $(target)
%.o:%.c
gcc -c $< -o $@
- wildcard:得到一系列文件名
- patsubst:对文件名做一个替换
一般makefile中会有一个clean选项,表示删除之前make生成的文件,规则:新建一个目标,不加依赖,\n\t直接写clean命令, 如下:
target = app
src = $(wildcard ./*.c)
obj = $(patsubst %.c, %.o, $(src))
$(target):$(obj)
gcc $^ -o $(target)
%.o:%.c
gcc -c $< -o $@
.PHONY:clean
clean:
rm -f $(obj) $(target)
- 如果目录下有clean文件则不会执行clean命令,因为clean没有依赖,所以总认为clean没有update。声明.PHONY:clean表示伪目标,不会进行更新比较,每次都执行。
- 另外,在makefile中,如果有命令执行失败,是不会继续执行的,所以可以在命令前加上-, 表示如果执行失败,忽略掉该命令。