4

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具

 1 year ago
source link: https://blog.51cto.com/xingyuli/5658567
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

0.Linux项目自动化构建工具 - make/Makefile

1.make和makefile是什么?

make是一个命令,makefile是一个文件

2.为什么要使用make和makefile?

首先我们仍然写一段最简单的代码来供我们参考

#include <stdio.h>
int main(){
printf("hello world\n");
return 0;
}
[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_.PHONY_02

我们在上篇文章说过,如果要编译这段C语言代码,我们可以使用

gcc test.c -o test
[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_makefile_05

我们发现结果没有问题。 

 如果我们不小心误写了gcc这行指令又会发生什么呢?

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_make_07

此时我们再来查看发现源文件都被覆盖掉了

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_makefile_09

为了避免这种问题的发生,我们可以使用makefile自动化构建工具。

因此我们可以回答问什么要使用make/makefile:

1.减少出现未定义的错误

2.减少构建项目的成本

3. 怎么创建makefile

我们前面提到了makefile是一个文件,因此我们在当前路径下创建一个makefile

touch Makefile
[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_.PHONY_12

3.1  编写makefile

 makefile:在当前路径下的一个普通文件

makefil内部包含两个东西:1.依赖关系 2.依赖方法

我们进入makefile输入

test:test.c
gcc test.c -o test
[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_makefile_15

3.1.1 依赖关系

上面的文件 test ,它依赖 test.c

3.1.2 依赖方法

gcc test.c -o test 就是与之对应的依赖关系

3.2 使用make

至此我们一个最简单的makefile就写好了,现在我们只需要输入make命令就会在makefile中寻找依赖关系和依赖方法已经我们在makefile中表明的依赖方法。

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_make_19

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_make_21

3.2.1 make的原理

1.make会在当前目录下找名字叫做"makefile"或“Makefile”的文件。

2.如果找到,他会找文件中的第一个目标文件,在上面的例子中,他会找到"test"这个文件,并把这个文件作为最终的目标文件

3.如果test文件不存在,或是test所依赖的后面test.c文件的文件修改时间要比test这个文件新(可以用touch测试),那么他就会执行后面所定义的命令来生成test这个文件

4.这就是make的依赖性,make会一层又一层的去找文件的依赖关系,知道最终编译出第一个目标文件

5.在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

6.make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

上面第3点说到的,test所依赖的后面test,c文件的文件修改时间,以及test这个文件的修改时间,这又是什么意思呢?

其实呀,这个是非常简单的,我们举例来说!

我们写好makefile之后进行make,第一次make时会运行依赖方法,当我们不进行任何操作直接进行第二次make时,我们发现并没有执行依赖方法。而是告诉我们test目标文件已经是最新的了。这也非常的好理解,如果我们已经gcc一次之后生成了目标文件,如果我们不对源文件进行修改时,我们再次gcc时其实生成的目标文件没有进行修改,仍然是之前第一次的目标文件,因此系统就没必要再执行一次依赖方法。

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_makefile_23

而当我们对test.c进行修改时,我们再次使用make,此时我们发现执行了依赖方法,这也非常好理解,系统发现源文件被修改,gcc之后形成的目标文件肯定和之前的目标文件不同,因此会执行依赖方法。这就是上面第3点所提到的问题。

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_make_25

3.2.2 查看文件修改时间

 我们使用stat可以查看文件的修改时间

stat 文件名称
[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_make_28

文件的时间有3个也叫ACM时间:

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_makefile_30

Access:读取或进入文件的时间

Modify:最后一次文件内容改变时间

Change:最后一次文件属性改变时间

假如我们改变一下源代码,我们发现修改文件的内容,Modify时间确实改变了,怎么chang time也发生了改变,这是因为修改文件内容可能会因此changtime的变化,内容变化后,属性可能会跟者变(比如文件的大小(size)).

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_.PHONY_32

3.3 编写项目清理

3.3.1 如何编写项目清理

.PHONY:clean
clean:
rm -f test
[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_makefile_35

此时,我们使用make clean就会对所创建的目标文件进行清理

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具_makefile_37

3.3.2 clean详解 

1.工程是需要被清理的

2.像clean这种,没有被第一个目标文件直接或者间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令 -- “make clean”,以此来清楚所有的目标文件,以便重编译

3.但是一般我们这种clean的目标文件,我们将设置为伪目标,用.PHONY 修饰,伪目标的特性是:总是被执行。

(本篇完)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK