4.makefile

1.make是什么?

gcc—编译器
make—Linux自带的构建器(方便管理整个项目)
	构建的规则在makefile中

2.makefile的命名方式

-GUNmakefile
-makefile
-Makefile

3.makefile工作原理

检查依赖是否存在
[1]检测依赖不存在:
	向下搜索下边的规则,如果有规则是用来生成查找的依赖的,执行规则中的命令
[2]检测依赖存在:
	原则:
		目标时间 > 依赖的时间   不更新
		目标时间 !> 依赖的时间   更新	

4.三种变量

1.自定义变量
2.makefile自带的变量:大写
	CPPFLAGS
	CC
3.自动变量
	$@:规则中的[目标]
	$<:规则中的[第一个依赖]
	$^:规则中的[所有的依赖]
注意:自动变量只能在规则中的命令中使用

5.模式匹配 %


6.makefile中的函数

makefile中的所有的函数都有返回值,函数介绍:

1.查找指定目录下指定类型的文件
	src=$(wildcard ./*.c)
2.匹配替换
	obj=$(patsubst %.c,%o,$(src))  #从$(src)文件中,将.c替换成.o

7.makefile中的语法规则

1.makefile中有一条或多条规则构成
2.makefile的每条规则包括三部分:目标,依赖文件,命令
3.语法格式:
目标:依赖文件
		命令

8.编写清理项目的规则

.PHONY:clean    #声明伪目标
clean:
	-rm $(obg) $(target) -f
解释:
	命令rm前加“-”,表示忽略错误,继续向下执行

9.让make生成不是终极目标的目标,执行下面命令

	make 目标名

10.[实战]

使用gcc编译程序:gcc main.c add.c sub.c mul.c -o app
==>转换成makefile编译程序:

[版本1]
app:main.c add.c sub.c mul.c
	gcc main.c add.c sub.c mul.c -o app
缺点(效率低,修改一个文件,所有文件都会被重新编译)

[版本2]
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
add.o:add.c
	gcc add.c -c
sub.o:sub.c
	gcc sub.c -c
mul.o:mul.c
	gcc mul.c -c
优点:改变某个.c文件,再执行make后,只编译修改后的文件
缺点:冗余

[版本3]
obj=main.o add.o sub.o mul.o
target=app
$(target):$(obj)
	gcc $(obj) -o $(target)   # 	gcc $^ -o $@
%.o:%.c
	gcc -c $< -o $@
缺点:可以执行差,可以使用[函数]解决

[版本4]
src=$(wildcard ./*.c)
obj=$(patsubst %.c,%o,$(src)) 
target=app
$(target):$(obj)
	gcc $(obj) -o $(target)   # 	gcc $^ -o $@
%.o:%.c
	gcc -c $< -o $@

11.[总结模板]:常用的makefile的书写方式

扫描二维码关注公众号,回复: 3596846 查看本文章
obj= #.o文件                                                        
target= #可执行文件                                                                                                                          
                                                                                       
$(target):$(obj)                                                                       
  $(CC)  $(obj) -o $(target)       # $(CC)  $^ -o $@                                                           
                                                                                       
%.o:%.c                                                          
  $(CC) -c $< -o $@         
                                                                                       
.PHONY:clean     #伪目标                                                             
clean:                                                                                 
  -rm $(obj) $(target) -f

猜你喜欢

转载自blog.csdn.net/weixin_36750623/article/details/83058723