大家好,好久不见!今天小狮子为大家带来的文章是一篇关于Linux下的项目自动化构建工具——make和makefile的博客,希望能帮助到大家。
当我们进行涉及多文件的工程开发时,我们需要对很多不同类型、不同功能,存在于不同目录下的源文件进行编译操作,这时错综复杂的文件关系会对我们造成很大的麻烦。那么这时我们就需要使用到make和makefile这样的自动化构建工具。
我们先大致地对make和makefile进行描述:
makefile是一个文件,其中定义了各个源文件的编译规则,比如说哪个文件应该先编译,哪个文件应该后编译,哪些文件需要重新编译等。除此之外,在makefile中还可以进行一些功能操作,例如对工程中的老旧文件进行清理。
make是一条指令,它可以解析makefile中的各种指令,从而自动化地对工程中的源文件进行各种操作。
make和makefile搭配使用可以大大地减少我们的工作量,达成“自动化编译”,这时我们只需要一个指令便可以使整个工程完全自动编译。
当我们大致地了解了make和makefile之后,我们接着对这两者进行详细的学习。
当我们想要使用make和makefile,我们首先需要在当前目录下创建一个makefile,makefile的文件名可以为makefile、Makefile或者GNUmakefile。这时固定的,因为在默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件。
那么我们以经典的“Hello world!”来简单演示和讲解make和makefile的使用方法。当我们创建了一个makefile之后,我们还需要创建该程序所需要的源文件,我将它命名为main.c,并在其中编写相关的代码(输出"Hello world!")。
准备过程完成如下:
现在我们进行对makefile文件的编写,编写makefile时,我们需要写入的内容主要有两个,分别称为依赖关系和依赖方法。
依赖关系:
表示一个文件的生成是依附于另一个文件,语法为 【目标文件:被编译文件】 ,也就是表明目标文件依赖被编译文件。
依赖方法:
代表依赖关系中的依赖文件该如何转化为目标文件,语法为 【tab 由依赖文件生成目标文件的手段】(这里必须使用tab作为前缀)。
那么让我们看看Hello world对应的makefile的依赖关系和依赖方法该如何编写:
这样设定好依赖关系和依赖方法之后我们就可以使用make创建出名为 HW 的可执行文件。语法为【make 指令】。其中 :
除此之外,如果我们现在想要对编译过程中产生的临时文件进行清理或者清理旧版本的程序时,如果我们直接使用rm指令进行清除,这样的行为未免有些粗鲁和危险。于是makefile中也需要支持对文件的清理工作,也就是clean。同样按照依赖关系和依赖方法的形式进行编写:
那么我们现在可以尝试使用makefile中的规则对文件进行清理:
上面就是make和makefile的一些简单运用,现在我们来看看makefile的工作原理:
在目标的更新中提到了文件时间的问题,这里简单的拓展一些关于文件时间的知识。我们都知道,文件=文件内容+文件时间。文件时间一般被分成三个时间,可以简单记为ACM三个时间:A(Access)、C(Change)、M(Modify)。Change代表最近改变文件内容的时间,Modify代表最近改变文件属性的时间,Access代表最近读文件的时间。
如果我们不想考虑文件时间,而想要无论什么情况都重新编译,这时就需要设置伪目标。伪目标表示这个目标总是被执行。一般来说产生可执行文件的逻辑是不会用伪目标修饰的,伪目标一般用于clean。
makefile中有一些特殊符号,这里列举一些特殊符号。
- :表示此命令即使执行出错,也依然继续执行后续命令。如:
-rm a.o build/
@:表示该命令只执行,不回显。一般规则执行时会在终端打印出正在执行的规则,而加上此符号后将只执行命令,不回显执行的规则。如:
@gcc -o HW main.c
$@和$^ 前者指的是依赖关系中的目标文件,后者指的是依赖关系中的依赖文件。如;
HW:main.c
gcc -o $@ $^
以上就是make和makefile的基本入门知识啦,希望能对大家有所帮助。