目录
1.make / makefile 介绍
make/makefile的基本概念
2.makefile 文件使用规则
1. makefile 创建
2.makefile格式
3.调用makefile
3. .PHONY的使用
4.makefile 文件万能化
1. 用符号表示目标和依赖
编辑 2.makefile支持变量
1.make / makefile 介绍
make/makefile的基本概念
make
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。
makefile
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
总结
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
2.makefile 文件使用规则
1. makefile 创建
- makefile 本质是一个脚本文件,需要自行创建并编写。
2.makefile格式
目标:依赖
[tab键]依赖
- 目标文件:这是Makefile中要生成的文件,通常是一个可执行文件或目标对象文件(如
.o
文件)
- 依赖文件:这些是生成目标文件所需的其他文件,可能是源代码文件、头文件或其他资源文件。
- 命令:当依赖文件比目标文件新或目标文件不存在时,执行相应的命令以更新或创建目标文件。这些命令通常包括编译、链接等操作,用于从依赖文件生成目标文件。
3.调用makefile
- make:直接调用 makefile 文件中的第一个目标。
- make + 目标名称:调用 makefile 文件中的其余目标。
make:
make + 目标名称:
最终的文件一定要放在前面,其他乱序没有问题。
3. .PHONY的使用
1. .PHONY的概念:
.PHONY是一个特殊的目标标记,用于告诉make工具,该目标不是一个真正的文件名,而是一个伪目标。在Linux内核生成文件中,.PHONY通常用于定义一些特殊的目标,这些目标不会生成对应的文件,而是用于执行一些特定的操作或命令。
2. .PHONY的作用:
- 避免与实际文件名冲突:由于.PHONY标记的目标不会生成对应的文件,因此可以避免与实际文件名冲突,确保make工具能够正确执行指定的操作。
- 提高执行效率:使用.PHONY标记可以告诉make工具,该目标不需要检查依赖关系和时间戳,从而提高执行效率。
- 定义常用操作:通过定义.PHONY目标,可以方便地执行一些常用的操作,如编译、安装、清理等。
3. .PHONY的格式:
.PHONY:目标目标:[依赖] 依赖
在上面makefile的时候我们举例用到过
.PHONY:cleanclean: rm -f mytest
当我们make一次了以后没有再次修改后,再一次make会发现无法执行了,这是因为与实际文件名冲突了,如果我们仍然想要这样可以 . PHNOY 将mytest避免冲突达到目的。
make命令是怎么做到知道是否要重新编译可执行程序的呢?
答案是 对比源代码和可执行程序的修改时间
如果源代码的修改时间在可执行程序的前面,make就不会再次编译,以求提升效率,如果我们再次修改源代码,此时源代码修改时间被改变,make命令后就会再次编译,此时生成新的可执行文件,新的可执行文件比再次修改的源代码要晚。
另外的我们可以用touch命令修改文件修改时间来达到再次生成一次程序的效果
4.makefile 文件万能化
概念引入
- 如果要更换之前我们举例的编译文件,那么 makefile 中要修改的内容就太多了,所以在实际开发中,makefile 文件是不会像下面这么写的。
1. 用符号表示目标和依赖
- makefile 中可用一些特殊的符号表示依赖文件和目标文件。
- 改变这些特殊符号变量的值就可以随意更改要编译和生成的可执行程序文件了
变量 | 说明 |
@ | 表示目标,会用 @ 替换成对应的目标 |
^ | 表示依赖,会用 ^ 替换成对应的依赖 |
2.makefile支持变量
- 在 makefile 文件中,敲出来的 test.cpp 和 test.exe 本质上都是字符串。
- 是字符串就能使用变量存储,之后就可以使用变量来代替实际的目标和依赖文件了。
编译的时候会自动变量替换。
另外的,如果我们想要不显示命令的内容,自己进行添加对命令操作的解释,我们可以在命令前面加上@符号和echo。
例:
如果在后面想改写其他文件,我们后续只需要修改test.c和code.exe即可