上一讲提到了
1.make是根据文件的时间戳来决定文件要不要重新编译,所以系统时间一定要正确,date来查看系统时间是否正确
2.命令前面一定是Tab进行缩进,不能用空格代替
3.makefile的优点是自动编译,直观;哪个源文件修改文件,只编译修改了的文件即可;
4.文件中的第一条语句是生成的最终目标。
文件的命名:一般只有这两种命名
makefile
Makefile
make执行的原理图:
补充几点:
每一个规则中的目标,都是一个文件,也可以是一个标签
每一个规则中的目标,不一定要有依赖
每一个目标文件的下方可以没有命令列表
工作原理:
#################################################################
一、makefile文件中的变量:
1.给这些目标文件起个别名:自定义变量
obj = main.o add.o sum.o mul.o //定义变量
main:$(obj) //$ + 变量名 表示使用变量中的内容
gcc $(obj) -o main
2.给最终文件起个别名:自定义变量
obj = main.o add.o sum.o mul.o //定义变量
target = main
$(target) : $(obj) //$ + (变量名) 表示使用变量中的内容
gcc $(obj) -o $(target)
3.模式规则
main: add.o sub.o mul.o
gcc add.c sub.o mul.o -o main
改写为下面的:
%.o : %.c
gcc -c $< -o $@
解释:通配,像命令中*一样,代表一切字符
在这里 % 分别是 add sub mul
4.命令规则中使用的自动变量
makefile中的自动变量: 只能在命名中使用
$< 规则中的第一个依赖
$@ 规则中的目标,绝对路径+名称
$^ 规则中的所有依赖 ,之间用空格分隔
5.1 makefile中自带的一些变量 之 CC
这些变量都有一个特点:都是 大写
一般来说,我们客户自定义的变量为 小写
使用的时候和自定义的一样, $(变量名),只不过这个变量名是makefile内置的
如:
CC = cc //这里的cc就指的gcc,当然也可以写出 CC = gcc
CXX = g++
示例:
CC = gcc
%.o : %.c
$(CC) -c $< -o $@
5.2 makefile中自带的一些变量
CPPFLAGS = -I //CPPFLAGS表示预处理器或者预编译期需要的一些参数选项,如
CFLAGS = -c //编译时候使用的参数 -Wall -g -c等
LDFLAGS = -L //链接库使用的选项 -L -l
二、makefile中的函数
makefile中的函数都是有返回值的,这些返回值通常是要获取的
1.获取指定目录的下的所有.c文件,并且将.c替换成对应的 .o
src = $(wildcard ./*.c)
//wildcard作用:找到指定路径下 某一种文件类型的所有文件
// 参数跟到函数名后,空格分隔,参数为路径 ,这里表示找当前目录下的所有的 .c 文件
//返回值 以字符串的形式返回,直接 $ 可以取出
obj = $(patsubst ./%.c, ./%.o, $src)
//作用匹配替换函数,将所有的 .c 替换成 .o
//这里使用的是模式替换 %,
//所有的 .c 文件从 src中取得,每次src中取一个 .c 文件,就将他替换成 .o 文件
假设我当前目录下的文件有:
a.c b.c c.c t.txt
make执行:src = $(wildcard ./*.c)
变量src中存储的字符串是:a.c b.c c.c
make执行:obj = $(patsubst ./%.c, ./%.o, $src)
变量obj中存储的字符型是:a.o b.o c.o
2.删除所有的.o文件,删除所有的.c文件
.PHONY:clean
clean:
rm $(obj) $(src) -f
-mkdir /aa //前面加 - 告诉make命令 如果这条命名出错,忽略掉即可,继续向下执行
谨慎使用,按照实际情况执行