1:什么是Makefile,有什么作用
什么是Makefile:makefile是一个专门用于编译程序的工具
makefile是在gcc的基础下形成相当于命令集合的工具 gcc -c main.c -o main.o
gcc -c fun.c -o fun.o
gcc main.o fun.o -o main
正常这三个指令我们每次编译都需要手动敲上去 如果又没Makefile 那么我们把编译指令写入Makefile 就仅仅只需要在中断敲make即可编译 你也可以把Makefile理解为命令集合–>它又不完全是命令集合有什么样的作用: 帮助我们编译大型的工程 现在有很多文件我们只需要在中断写入make指令即可完成编译Makefile文件特性: 他是一个工具也是一个文件 这个文件默认系统支持不需要安装任何软件 * 这个文件必须以 Makefile/makefile – 命名2:最简单的Makefile示例第一个Makefileall: gcc -c main.c -o main.o gcc -c fun.c -o fun.o gcc main.o fun.o -o main3:Makefile示例分析示例分析: all: — > makefile中叫做目标 主目标—执行make一定会执行的 次目标—必须执行 make + 目标名 目标下面跟的: 就是相关的指令 这些指令可以是系统命令/环境变量 也可以是Makefile支持函数 强调一点: 目标下的命令必须以 Tab键开头 默认情况下只会执行第一个目标-主目标4:Makefile的依赖关系和执行过程main:main.o fun.o gcc main.o fun.o -o main如果没有依赖文件: 1:我去寻找依赖文件的目标去执行 2:找不到就报错经过改版:第二个Makefile:main:main.o fun.o gcc main.o fun.o -o mainmain.o:main.c gcc -c main.c -o main.ofun.o:fun.c gcc -c fun.c -o fun.o * " : " 冒号后面是目标依赖文件/依赖目标 * 只有依赖目标/文件得以执行 主目标才能执行5:Makefile的普通变量 Makefile的变量: 1:什么时候用什么时候就可以定义 2:Makefile的变量没有类型之分 3:makefile的变量通过 $符号引用 --变量里面的内容++++++++++++++++++++++++++++++++++++++++++++++++++++++name = 123456789main:main.o fun.o gcc main.o fun.o -o mainmain.o:main.c gcc -c main.c -o main.ofun.o:fun.c gcc -c fun.c -o fun.oecho: @echo “name” == $(name) 执行 make echo 就会执行echo的目标 执行@echo “name” ==
(
n
a
m
e
)
结
果
:
n
a
m
e
=
=
1234567896
:
M
a
k
e
f
i
l
e
的
特
殊
变
量
(name) 结果: name == 1234567896:Makefile的特殊变量
(name)结果:name==1234567896:Makefile的特殊变量@:代表目标
:
代
表
目
标
依
赖
文
件
集
合
^:代表目标依赖文件集合
:代表目标依赖文件集合<:代表目标依赖文件集合的第一个文件
<
:
质
变
—
>
<:质变—>%统配符规则下回发生质变第三个Makefile:OBJ = main
<:质变—>(OBJ):main.o fun.o gcc $^ -o $@main.o:main.c gcc -c $^ -o $@fun.o:fun.c gcc -c $^ -o $@echo: @echo “name” ==
(
n
a
m
e
)
特
性
:
s
h
e
l
l
−
>
专
用
的
写
命
令
集
合
的
文
件
他
也
可
向
M
a
k
e
f
i
l
e
一
样
写
g
c
c
−
c
m
a
i
n
.
c
−
o
m
a
i
n
.
o
g
c
c
−
c
f
u
n
.
c
−
o
f
u
n
.
o
g
c
c
m
a
i
n
.
o
f
u
n
.
o
−
o
m
a
i
n
也
可
以
实
现
编
译
那
么
M
a
k
e
f
i
l
e
跟
S
h
e
l
l
脚
本
有
什
么
区
别
?
∗
自
动
检
测
你
的
文
件
是
否
修
改
∗
如
果
修
改
则
编
译
−
没
修
改
编
译
∗
M
a
k
e
f
i
l
e
只
会
编
译
修
改
过
的
文
件
这
有
什
么
好
处
?
−
−
快
7
:
M
a
k
e
i
f
l
e
通
配
符
匹
配
M
a
k
e
f
i
l
e
有
一
个
通
配
符
−
−
(name) 特性: shell->专用的写命令集合的文件 他也可向Makefile一样写 gcc -c main.c -o main.o gcc -c fun.c -o fun.o gcc main.o fun.o -o main 也可以实现编译 那么Makefile跟Shell脚本有什么区别? *自动检测你的文件是否修改 *如果修改 则编译 -没修改编译 *Makefile只会编译修改过的文件 这有什么好处?--快7:Makeifle通配符匹配Makefile 有一个通配符 -- % 它就相当于Linux下的 * 第四个Makefile:OBJ = main
(name)特性:shell−>专用的写命令集合的文件他也可向Makefile一样写gcc−cmain.c−omain.ogcc−cfun.c−ofun.ogccmain.ofun.o−omain也可以实现编译那么Makefile跟Shell脚本有什么区别?∗自动检测你的文件是否修改∗如果修改则编译−没修改编译∗Makefile只会编译修改过的文件这有什么好处?−−快7:Makeifle通配符匹配Makefile有一个通配符−−(OBJ):main.o fun.o gcc $^ -o $@%.o:%.c gcc -c $< -o $@clean: rm .o main/**************************************************/ * main.c fun.c - > %.c * fun.o main.o -> %.o 在%符号的规则下 $<就不再是集合的第一个文件了 而是集合的每一个文件%.o:%.c gcc -c $< -o $@ 相当于:main.o:main.c gcc -c $< -o $@fun.o:fun.c gcc -c $< -o
@
8
:
M
a
k
e
f
i
l
e
专
用
函
数
@8:Makefile专用函数
@8:Makefile专用函数(wildcard PATTERN…)通配符”%”只有在规则中才会展开,如果在变量定义和函数使用的时候,则不会自动展开,这时候就要用到 wildcard函数 例如$(wildcard .c) 获取当前目录下的所有.c文件,类似“%” “” 路径不要用/obj/src形式 用 obj/src 前面没有根目录 也可以是./obj/srcpatsubst:模式字符串替换 $(patsubst %.c,%.o,a.c b.c c.c) 把字符串的.c 替换成 .o 将字符串“a.c b.c c.c”中的所有符合“%.c”的字符串,替换为“%.o”替换完成以后的字符串为“a.o b.o c.o”。有了第五个Makefile:OBJ = mainCFILE = $(wildcard .c)OFILE =
(
p
a
t
s
u
b
s
t
(patsubst %.c,%.o,
(patsubst(CFILE))
(
O
B
J
)
:
(OBJ):
(OBJ):(OFILE) gcc $^ -o $@%.o:%.c gcc -c $< -o $@clean: rm .o mainecho: @echo “CFILE” = $(CFILE)@echo “OFILE” =
(
O
F
I
L
E
)
其
他
剩
余
函
数
:
(OFILE)其他剩余函数:
(OFILE)其他剩余函数:(foreach , ,
最后附上一张我的Makefile
跟我一起写Makefile
最新推荐文章于 2024-06-01 20:19:52 发布