1、makefile的编写
1)makefile的命名
2)规则中的三要素:目标,依赖,命令
固定格式:
目标:依赖条件
Tab键 命令(gcc)
eg:
app:main.c add.c sub.c mul.c
gcc main.c add.c sub.c mul.c -o app
如果.c不在同一级目录,须指定目录
上面方法的缺点就是:每一次make都会编译所有的文件
基于以上缺点改进的新规则
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 main.c -c main.o
add.o:add.c
gcc add.c -c add.o
mul.o:mul.c
gcc mul.c -c mul.o
优点:当其中某个.c文件改变只需要编译某个.c文件,而不需要全部编译
Makefile 的更新机制,通过对比目标文件和依赖文件的更新时间,如果目标文件的更新时间早于依赖文件则开始编译;
以上例子为例,如果makefile中有多个目标,那么第一条中的目标就是我们的终极目标
Makefile中的变量:包括自定义变量 自动变量 自己维护的变量
自定义变量
eg obj = main.o add.o sub.o mul.o
$(obj)提取变量里面的值
替换: 3,4 s/app/g/$(target)
自动变量:
$< 指的是所有依赖文件中的第一个依赖
$^ 依赖文件中所有的依赖文件
$@ 规则中的目标
系统维护的变量:
CC = cc = gcc
CPPFLAGS = -I //指定头文件
CFLAGS = -Wall -g -c //编译时使用的参数
LDFLAGS = -L -l//链接库使用的选项-L -i
通过学习以上变量后,重新编写makefile
.PHONY clean
obj = main.o mul.o add.o mul.o
target = myapp
CC = gcc
CFLAGS = -g -Wall -c
$(target):$(obj)
$(CC) $(CFLAGS) $(obj) -o $@
%.o:%.c
$(CC) -c %.c
clean:
rm $(target) %(obj) -rf
终极版本
在一个项目中我们可能会有很多的源文件,如果一一的列在makefile 文件中会使得Makefile文件变得冗长,于是为了解决这个问题,我们引入了makefile函数
$(wildcard 参数(路径/*.c)
$(patsubst 路径/%.c , 路径/%.o ,$(src))
通过$符号获取函数返回值
其中第二条命令用%而不用*原因是为了模式匹配,即一个.c文件生成一个对应的.o文件。
./PHONY clean//声明clean 为一个伪目标,也就是不会再把本地磁盘做更新比较。
clean:
rm $(obj) $(target) -f (强制执行)
-mkdir /aa //在mkdir前面加了- 表示如果当前命令执行失败,就忽略本次命令,继续执行后面的命令