
1.make/mkfile的简单介绍
自动化构建程序
make是一个命令,
makefile是一个文件——依赖关系和依赖方法
依赖关系:我为什么要帮你?Why?
依赖方法:我怎么帮你?How?
2. 如何使用?
目标文件:依赖文件列表
(tab键) 依赖关系
首先写一个简单的程序
3. 写入
- 创建
makefile
文件,进行写入; - 项目的自动化构建 编译文件
mybin:mytest.cpp
g++ -o mybin mytest.cpp
- 项目自动化清理 清理文件 -不需要依赖文件
mybin:mytest.cpp
g++ -o mybin mytest.cpp
clean:
rm -f mybin
- make和makefile形成目标文件时,默认从上往下扫描makefile文件,执行第一个执行方法(默认形成第一个文件)。
- 默认只执行一个。
我们思考一个问题:make、makefile怎么会知道mybin是最新的呢?
make依靠时间对比是否重新编译,只要可执行程序比所有源文件最近的时间(ACM)都新,就说明是新的。
4.ACM时间
stat +文件名
Access:访问时间(cat…累积到一定时间后更新,不是实时更新,保证不对系统造成太大负担);
Modify:对文件内容做修改;touch
对时间进行刷新,make对照的是Modify
Change:对文件属性(ll
查看)做修改;
对内容做修改,Modify时间,其Change时间属性时间也发生改变;(文件包括内容和属性,二者对立统一😉)
注:更新时间 touch +文件名
对Modify时间刷新;
5. 补充 .PHONY
.PHONY
:可修饰mybin目标文件,让它成为一个伪目标(总是会执行当前目标)
由于编译的文件每次都需要被清理,所以一般将clean
修饰;
$@
:目标文件
$^
:依赖文件列表
- 定义变量(替换)
6. 实际实现过程
结合编译流程,我们可写出链接时的实际实现过程为:
mybin:mytest.o
g++ -o mybin mytest.o
mytest.o:mytest.s
g++ -c -o mytest.o mytest.s
mytest.s:mytest.i
g++ -S -o mytest.s mytest.i
mytest.i:mytest.cpp
g++ -E -o mytest.i mytest.cpp
.PHONY:clean
clean:
rm -f mybin mytest.s mytest.i mytest.o
可以更好立即编译原理,但在实际中不会像如上编写,直接生成.o
文件。
7. 小技巧
在编写文件前先写通makefile文件,防止将源文件和makefile弄反覆盖源代码。
如下步骤:
