makefile
一、make是如何工作的
在默认的方式下,也就是我们只输入 make
命令。那么
https://zhuanlan.zhihu.com/p/44267123
-
make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
-
如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
-
如果edit文件不存在,或是edit所依赖的后面的
.o
文件的文件修改时间要比edit
这个文件新,那么,他就会执行后面所定义的命令来生成edit
这个文件。 -
如果
edit
所依赖的.o
文件也不存在,那么make会在当前文件中找目标为.o
文件的依赖性,如果找到则再根据那一个规则生成.o
文件。(这有点像一个堆栈的过程) -
当然,你的C文件和H文件是存在的啦,于是make会生成
.o
文件,然后再用.o
文件生成make的终极任务,也就是执行文件edit
了。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
通过上述分析,我们知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令—— make clean
,以此来清除所有的目标文件,以便重编译。
于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如 file.c
,那么根据我们的依赖性,我们的目标 file.o
会被重编译(也就是在这个依性关系后面所定义的命令),于是 file.o
的文件也是最新的啦,于是 file.o
的文件修改时间要比 edit
要新,所以 edit
也会被重新链接了(详见 edit
目标文件后定义的命令)。
而如果我们改变了 command.h
,那么, kdb.o
、 command.o
和 files.o
都会被重编译,并且, edit
会被重链接。
二、filter-out
函数名称 :反过滤函数—filter-out。
函数功能 :和“filter”函数实现的功能相反。过滤掉字串“TEXT”中所有符合模式“PATTERN”的单词,保留所有不符合此模式的单词。可以有多个模式。存在多个模式时,模式表达式之间使用空格分割。
返回值 :空格分割的“TEXT”字串中所有不符合模式“PATTERN”的字串。
函数说明: “filter-out”函数也可以用来去除一个变量中的某些字符串(实现和“filter”函数相反)。
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
$(filter-out$(mains),$(objects))
实现了去除变量“objects”中“mains”定义的字串(文件名)功能。它的返回值为“foo.o bar.o”。
三、filter
$(filter PATTERN…,TEXT)
数名称:过滤函数—filter。
函数功能:过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词,保留所
有符合此模式的单词。可以使用多个模式。模式中一般需要包含模式字
符“%”。存在多个模式时,模式表达式之间使用空格分割。
返回值:空格分割的“TEXT”字串中所有符合模式“PATTERN”的字串。
函数说明:“filter”函数可以用来去除一个变量中的某些字符串,我们下边的例子中
就是用到了此函数。
示例:
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo
使用“$(filter %.c %.s,$(sources))”的返回值给 cc 来编译生成目标“foo”,函数返回
值为“foo.c bar.c baz.s”
四、其他示例
1.addprefix 添加前缀
$(addprefix src/,foo bar)
返回值为“src/foo src/bar”。
2.patsubst模式替换
$(patsubst %.c,%.o, a.c b.c)
把字串“a.c b.c”符合模式[%.c]的单词替换成[%.o],返回结果是“a.o b.o”
3.subst字符窜替换
$(subst a,the,There is a big tree),
foo=ba
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具