
[Linux] make与makefile用法简单介绍


helloworld
有关Linux平台下代码的编译的分析, 推荐博主文章:
本篇文章不多赘述
make 和 makefile
make 与 makefile
make 是什么?


make 其实就是一个指令
, 但是 其依靠的makefile文件又是什么呢?makefile 是什么?

-
依赖关系
就像 文件中第一行
helloworld:helloworld.cpp
这个语句, 就可以表示需要生成的可执行程序helloworld 依赖于 helloworld.cpp 文件
而这个格式也是makefile文件内容中 表示文件之间依赖关系的格式, 即
xxxxx:xxxxx
:
之前是目标文件,:
之后是目标文件所依赖的文件, 目标文件可以存在多个依赖文件, 此时需要在:
后表明多个依赖文件 -
依赖方法
除依赖关系之外, 目标文件与依赖文件之间还存在依赖方法, 即 表示依赖关系语句的下一行语句, 在上例中为
g++ helloworld.cpp -o helloworld
此依赖方法, 其实就是
由依赖文件生成目标文件所需要的执行的指令
表示依赖关系语句的下一行就是依赖方法。需要注意的是, 依赖方法前必须存在一个
Tab长度(不能为4个空格)
直接根据makefile中提供的依赖关系和依赖方法自动执行指令
对于简单、少量的文件编译使用make和makefile 会显得多此一举
但是对于复杂的、大量的文件或程序进行编译等处理时, 如果已经事先编写好了makefile文件, 那么无论之后需要重复处理多少次都只需要输入一个make指令, 就可以自动完成
make clean
make clean
, 此指令用于清除make指令执行之后生成的文件


makefile文件中
clean: rm -f helloworld
此格式与 依赖关系和依赖方法的格式相同, 但是 clean并没有依赖文件, 执行依赖方法也不会生成clean文件
输入 make clean 指令也可以执行依赖方法
那么有没有可能, makefile文件的每个依赖关系语句的目标文件, 都可以作为make指令的后缀 与 make结合作为一个指令。此指令的作用是执行依赖关系的依赖方法
测试一下:
然后先执行 make:
生成了helloworld可执行文件和helloworld.o文件
再make clean清除:
那么可不可以 输入 make helloworld.o 只执行相应的依赖方法呢?
答案是可以的, 所以 其实makefile依赖关系中的目标文件是可以作为make指令的后缀 当成一个单独的指令的
.PHONY
.PHONY:clean
无论此目标文件名是否存在是否为最新, 此目标文件的依赖方法恒可以执行


.PHONY:helloworld
时, 再多次执行 make:
此目标文件的依赖方法恒可执行, 无论目标文件是否存在、是否最新
*扩展: make时, 指令如何判断目标文件是否最新?

最近访问时间
最近更改时间
最近改动时间



作者: 哈米d1ch 发表日期:2023 年 2 月 27 日