📕作者简介:热编程的贝贝,致力于C/C++、Java、Python等多编程语言,热爱跑步健身,喜爱音乐的一位博主。
📗本文收录于贝贝的日常汇报系列,大家有兴趣的可以看一看
📘相关专栏深度学习、目标检测系列等,大家有兴趣的可以看一看
📙C++零基础入门系列,Web入门篇系列正在发展中,喜欢Python、C++的朋友们可以关注一下哦!
📗如有需要此项目工程,请评论区留言哦 也可联系作者微信 Qwe1398276934
一个
Makefile
文件中可以有一个或者多个规则
目标
...:
依赖
...
命令(Shell 命令)
...
⚫
目标:最终要生成的文件(伪目标除外)
⚫
依赖:生成目标所需要的文件或是目标
⚫
命令:通过执行命令对依赖操作生成目标(命令前必须
Tab
缩进)
app: sub.c add.c mult.c div.c main.c
gcc sub.c add.c mult.c div.c main.c -o app
命令在执行之前,需要先检查规则中的依赖是否存在
如果存在,执行命令
如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,
如果找到了,则执行该规则中的命令
app:sub.o add.o mult.o div.o main.o
gcc sub.o add.o mult.o div.o main.o -o app
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
mult.o:mult.c
gcc -c mult.c -o mult.o
div.o:div.c
gcc -c div.c -o div.o
main.o:main.c
gcc -c main.c -o main.o
检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间
如果依赖的时间比
目标的时间晚,需要重新生成目标
如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被
执行
如果不更改文件,
make
输出
make: “app”已是最新。
更改了
main.c
文件,则输出
gcc -c main.c -o main.o
gcc sub.o add.o mult.o div.o main.o -o app
◼
自定义变量
变量名
=
变量值
var=hello
◼
预定义变量
AR :
归档维护程序的名称,默认值为
ar
CC : C
编译器的名称,默认值为
cc
CXX : C++
编译器的名称,默认值为
g++
$@ :
目标的完整名称
$< :
第一个依赖文件的名称
$^ :
所有的依赖文件
◼
获取变量的值
$(
变量名
)
app:main.c a.c b.c
gcc -c main.c a.c b.c
#
自动变量只能在规则的命令中使用
app:main.c a.c b.c
$(CC) -c $^ -o $@
$(var)
add.o:add.c
gcc -c add.c
div.o:div.c
%.o:%.c
gcc -c div.c
- %:
通配符,匹配一个字符串
sub.o:sub.c
-
两个
%
匹配的是同一个字符串
gcc -c sub.c
%.o:%.c
mult.o:mult.c
gcc -c $< -o $@
gcc -c mult.c
main.o:main.c
gcc -c main.c
$(wildcard PATTERN...)
功能:获取指定目录下指定类型的文件列表
参数:
PATTERN
指的是某个或多个目录下的对应的某种类型的文件,如果有多
个目录,一般使用空格间隔
返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
示例:
$(wildcard *.c ./sub/*.c)
返回值格式
: a.c b.c c.c d.c e.c f.c
$(patsubst <pattern>,<replacement>,<text>)
功能:查找
<text>
中的单词
(
单词以“空格”、“
Tab
”或“回车”“换行”分隔
)
是否符合
模式
<pattern>
,如果匹配的话,则以
<replacement>
替换。
<pattern>
可以包括通配符
`%`
,表示任意长度的字串。如果
<replacement>
中也包含
`%`
,那么,
<replacement>
中的这个
`%`
将是
<pattern>
中的那个
%
所代表的字串。
(
可以用
`\`
来转义,以
`\%`
来表示真实含义的
`%`
字符
)
返回:函数返回被替换过后的字符串
示例:
$(patsubst %.c, %.o, x.c bar.c)
返回值格式
: x.o bar.o
src=sub.o add.o mult.o div.o main.o
target=app
$(target):$(src)
$(CC) $(src) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
找依赖,找
sub.o
如果没有找到,则找到第二条
%.o:%.c
通用模式匹配,编译出
sub.o
src=$(wildcard ./*.c)
objs=$(patsubst %.c,%.o,$(src))
target=app
$(target):$(objs)
$(CC) $(objs) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
默认执行第一个规则
,如果想
执行其他需要指定
make clean
src=$(wildcard ./*.c)
objs=$(patsubst %.c,%.o,$(src))
target=app
$(target):$(objs)
$(CC) $(objs) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
clean:rm $(objs) -f
定义为伪目标,就不会生成特定的文件
.PHONY:clean
clean:
rm $(objs) -f
如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给恒川的意见,欢迎评论区留言。
562

被折叠的 条评论
为什么被折叠?



