项目代码管理工具
1).命名规则
Makefile或makefile
2).makefile的规则:
规则中有三要素:目标,依赖,命令

1 2 3 4 5 6
| 目标:依赖 命令 //命令左边一定要有一个tab缩进
app:main.c add.c sub.c mul.c gcc main.c add.c sub.c mul.c -o app
|


1 2 3 4 5 6 7 8
| main:main.o add.o gcc main.o add.o -o main
main.o:main.c gcc -c main.c
add.o:add.c gcc -c add.c
|
当add.c的修改时间 大于add.o的修改时间时,表示文件过时了
终极目标一定要在最前面
makefile中的变量
1 2 3 4 5 6 7
| obj=main.o add.o target=main $(target):$(obj) gcc $(obj) -o $(target)
%.o:%.c gcc -c $< -o $@
|
1
| %.o:%.c代表自动匹配,当main.o找不到的时候,会自动匹配%.o:%.c,然后变成main.o:main.c
|
makefile中的自动变量
1 2 3 4
| $< 规则中的第一个依赖 $@ 规则中的目标 $^ 规则中的所有依赖 只能在规则的命令中使用
|
由Makefile维护的一些变量
1 2 3 4 5
| 通常都是大写 CC:默认值cc CPPFLAGS:预处理器需要的选项 -I CFLAGS:编译的时候使用的参数 -Wall -g -c LDFLAGS: 链接库使用的选项 -L -l
|
1 2 3 4 5 6 7 8 9
| obj=main.o add.o target=main CC=gcc
$(target):$(obj) $(CC) $(obj) -o $(target)
%.o:%.c $(CC) -c $< -o $@
|
makefile中的函数
所有的函数都有返回值
wildcard函数
取目录所有参数指定的文件
1 2 3 4
| $(wildcard 参数) $代表取函数值 src=$(wildcard ./*.c) 获取当前目录的所有.c文件
|
patsubst函数
替换函数
1 2 3
| $(patsubst 被替换的字符串, 要替换的字符串,源字符串) obj=$(patsubst ./%.c, ./%.o,$(src)) 将变量src中所有.c字符串替换成.o字符串
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| 1 #obj=main.o add.o 2 src=$(wildcard ./*.c) 3 obj=$(patsubst ./%.c, ./%.o,$(src)) 4 5 target=main 6 CC=gcc 7 CFLAGS=-g 8 $(target):$(obj) 9 $(CC) $(obj) -o $(target) $(CFLAGS) 10 11 %.o:%.c 12 $(CC) -c $< -o $@ 13
|
1 2 3 4 5
| clean: rm $(obj) $(target) 删除所有变量obj和target文件 使用 make clean
|
伪目标
不进行更新操作.
例如当前目录下有一个clean文件,当执行make clean之后会显示当前已是最新,加上伪目标之后会忽略更新,直接运行
1 2 3
| .PHONY:clean clean: rm $(obj) $(target)
|
忽略命令错误
在命令前面加上-表示如果当前命令出错了,自动忽略错误,继续执行下一条命令
1 2
| clean: -rm $(obj) $(target)
|