跟我一起写makefile(二)

上一讲提到了
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命令 如果这条命名出错,忽略掉即可,继续向下执行
谨慎使用,按照实际情况执行
跟我一起 Makefile 作者:陈皓 整理:祝冬华 来源网络,希望能与大家分享这份学习资料,资源分数也设置了最低值,如有侵权,请联系我删除文件。 第一部分、概述 (6) 第部分、关于程序的编译和链接 (6) 第三部分、Makefile 介绍 (7) 一、Makefile的规则 (7) 、一个示例 (8) 三、make是如何工作的 (9) 四、makefile中使用变量 (10) 五、让make自动推导 (11) 六、另类风格的makefile (12) 七、清空目标文件的规则 (13) 第四部分、Makefile 总述 (13) 一、Makefile里有什么? (13) 1、显式规则。 (14) 2、隐晦规则。 (14) 3、变量的定义。 (14) 4、文件指示。 (14) 5、注释。 (14) Makefile文件名 (15) 三、引用其它的Makefile (15) 四、环境变量 MAKEFILES (16) 五、make的工作方式 (16) 第五部分、书规则 (17) 一、规则举例 (17) 、规则的语法 (17) 三、在规则中使用通配符 (18) 四、文件搜寻 (19) 五、伪目标 (20) 六、多目标 (22) 七、静态模式 (22) 八、自动生成依赖性 (24) 第六部分书命令 (25) 一、显示命令 (26) 、命令执行 (26) 三、命令出错 (27) 四、嵌套执行make (28) 五、定义命令包 (30) 第七部分使用变量 (30) 一、变量的基础 (31) 、变量中的变量 (32) 三、变量高级用法 (34) 四、追加变量值 (37) 五、override 指示符 (37) 六、多行变量 (38) 八、目标变量 (39) 九、模式变量 (40) 第八部分使用条件判断 (40) 一、示例 (40) 、语法 (42) 第九部分使用函数 (43) 一、函数的调用语法 (44) 、字符串处理函数 (44) 1、subst (44) 2、patsubst (45) 3、strip (45) 4、findstring (46) 5、filter (46) 6、filter-out (46) 7、sort (47) 8、word (47) 9、wordlist (47) 10、words (47) 11、firstword (48) 12、字符串函数实例 (48) 三、文件名操作函数 (48) 1、dir (48) 2、notdir (48) 3、suffix (49) 4、basename (49) 5、addsuffix (49) 6、addprefix (49) 7、join (50) 四、foreach 函数 (50) 五、if 函数 (50) 六、call函数 (51) 七、origin函数 (51) “undefined” (52) “default” (52) “file” (52) “command line” (52) “override” (52) “automatic” (52) 八、shell函数 (53) 九、控制make的函数 (53) 1、error (53) 2、warning (54) 第十部分 make 的运行 (54) 、指定Makefile (54) 三、指定目标 (55) “all” (56) “clean” (56) “install” (56) “print” (56) “tar” (56) “dist” (56) “TAGS” (56) “check”和“test” (56) 四、检查规则 (57) 五、make的参数 (57) 第十一部分隐含规则 (61) 一、使用隐含规则 (61) 、隐含规则一览 (62) 1、编译C程序的隐含规则 (63) 2、编译C++程序的隐含规则 (63) 3、编译Pascal程序的隐含规则 (63) 4、编译Fortran/Ratfor程序的隐含规则 (63) 5、预处理Fortran/Ratfor程序的隐含规则 (63) 6、编译Modula-2程序的隐含规则 (63) 7、汇编和汇编预处理的隐含规则 (64) 8、链接Object文件的隐含规则 (64) 9、Yacc C程序时的隐含规则 (64) 10、Lex C程序时的隐含规则 (64) 11、Lex Ratfor程序时的隐含规则 (65) 12、从C程序、Yacc文件或Lex文件创建Lint库的隐含规则 (65) 三、隐含规则使用的变量 (65) 1、关于命令的变量。 (65) 2、关于命令参数的变量 (66) 四、隐含规则链 (67) 五、定义模式规则 (68) 1、模式规则介绍 (68) 2、模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值