make及mkfile文件配置教程

@TOC

【Linux】make及mkfile文件配置教程

1.make/mkfile的简单介绍

自动化构建程序
make是一个命令,
ffd7c2039d670c14f39a969bc533ee79_MD5
makefile是一个文件——依赖关系依赖方法
依赖关系:我为什么要帮你?Why?
依赖方法:我怎么帮你?How?

2. 如何使用?

目标文件:依赖文件列表
(tab键) 依赖关系

首先写一个简单的程序89f33ad848fec905b481bc0c0162ee05_MD5

3. 写入

  • 创建makefile文件,进行写入;
  • 项目的自动化构建 编译文件
    75b67bd781b4de518f828264812603ce_MD5
1
2
mybin:mytest.cpp
g++ -o mybin mytest.cpp
  • 项目自动化清理 清理文件 -不需要依赖文件
1
2
3
4
mybin:mytest.cpp
g++ -o mybin mytest.cpp
clean:
rm -f mybin

3010f2c8386c8a4e3d7c0916ebabb757_MD5

  1. make和makefile形成目标文件时,默认从上往下扫描makefile文件,执行第一个执行方法(默认形成第一个文件)。
  2. 默认只执行一个。

我们思考一个问题:make、makefile怎么会知道mybin是最新的呢?
222ab8befdc5638ac5a7078cb32153a4_MD5
make依靠时间对比是否重新编译,只要可执行程序比所有源文件最近的时间(ACM)都新,就说明是新的。

4.ACM时间

stat +文件名

Access:访问时间(cat…累积到一定时间后更新,不是实时更新,保证不对系统造成太大负担);
Modify:对文件内容做修改; touch对时间进行刷新,make对照的是Modify
Change:对文件属性(ll查看)做修改;
对内容做修改,Modify时间,其Change时间属性时间也发生改变;(文件包括内容和属性,二者对立统一😉)
bc1394b89248b1614438d9861f8da0b0_MD5

注:更新时间 touch +文件名对Modify时间刷新;
6fd225569792d5ad3107747eed95e79b_MD5

5. 补充 .PHONY

.PHONY:可修饰mybin目标文件,让它成为一个伪目标(总是会执行当前目标)
bcf59ae19a7ecc3d98205aa490930d73_MD5
由于编译的文件每次都需要被清理,所以一般将clean修饰;

$@:目标文件
$^:依赖文件列表

  • 定义变量(替换)
    57fd777aa3f92bb00823bf06bf459be4_MD5

6. 实际实现过程

结合编译流程,我们可写出链接时的实际实现过程为:

1
2
3
4
5
6
7
8
9
10
11
12
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

a53e19bff712790d354fe4ae69852789_MD5

可以更好立即编译原理,但在实际中不会像如上编写,直接生成.o文件。

7. 小技巧

在编写文件前先写通makefile文件,防止将源文件和makefile弄反覆盖源代码。
如下步骤:
889c0f76a7eacc3b4ce64d648e9c0e31_MD5