自动化构建make / Makefile的可以提高编译效率。
在讲自动化构建之前,我们要先了解一些内容。
现在有一个code.c文件,内容如下图:

现在来用gcc编译code.c文件

编译之后就有了这个可执行文件。现在来运行这个文件。

通过上面的过程我们可以发现,代码要经过编译才能称为可执行程序来运行。
编译这个过程有4个步骤:
1、预处理(进行宏替换/去注释/条件编译/头文件展开等)
2、编译(生成汇编)
3、汇编(生成及其可识别代码)
4、链接(生成可执行文件或库文件)
现在来试着还原这个过程。


查看code.i文件

进入这个文件之后发现一共有800多行,当前步骤就是预处理。进行宏替换/去注释/条件编译/头文件展开等


查看code.s文件

当前步骤就是编译,将代码转换成汇编语言


.o文件是可重定位目标二进制文件,查看code.o文件里面的内容

当前步骤就是汇编
最后还需要链接生成可执行程序


成功生成可执行程序mycode,现在来运行这个程序

现在我们就知道了C语言文件通过编译形成可执行文件。
我们在进行编译文件时,不用向上面一步一步的编译,下面的指令可以一步到位。

现在是只有一个C语言文件,我们只需要写一条指令就可以完成编译。假设当前目录下有100个C语言文件,难道我们要写100条gcc指令吗。
自动化构建make / Makefile就可以帮我们处理这个问题。
make是一个指令。
Makefile是一个文件。
现在从新创建一个test.c文件,文件内容如下如图:

现在尝试着用Makefile文件来实现编译。
先创建Makefile文件(首字母可以大写也可以小写,这里选择大写)

现在进入Makefile文件编写文件。

现在先写一个最简单的Makefile文件,Makefile文件需要依赖关系和依赖方法。
我们现在想把test.c文件编译成可执行程序mytest
依赖关系就是mytest依赖test.c文件

有了依赖关系后还需要依赖方法

现在保存并退出Makefile文件,并用make命令

能够发现成功创建了可执行程序mytest,现在来运行一下。

现在我们能够生成可执行程序,既然可以生成可执行程序,那么也需要删除可执行程序才行。

保存并退出Makefile文件。执行make clean观察效果

现在来讲伪目标,先查看当前目录:

发现没有可执行程序。

make之后有可执行程序,试着再make一次。

提示这里并没有重新生成可执行程序。因为没有对test.c的内容修改。所以就不会重新生成可执行程序。现在来对test.c文件修改。

这里多加了一条打印语句。退出test.c文件再次执行make命令。

发现可以执行make命令。这是因为编译器会对test.c文件进行检测,当用户对test文件没有进行修改操作,只是查看。那么其实就没有必要生成新的可执行程序,之前的可执行程序就能用 。编译器是如何检查是否有对test.c文件进行检查呢?
答案就是观察test.c文件的修改时间和可执行程序的修改时间。

Modify就是修改时间。
按流程来就是先创建test.c文件,再生成可执行程序mytest。
所以test.c的修改时间一定在mytest修改时间之前。

此时用make命令是不能再新创建可执行程序。

只有在我们修改了test.c文件的内容后,test.c的修改时间会到mytest的修改时间之后。
现在来用touch指令更改test.c的修改时间。

这里可以发现test.c的修改时间在mytest的修改时间之后。

此时再执行make命令就可以成功。

编译器就是通过对比修改时间来进行检查。
现在来多次输入make clean

发现可以多次执行。
所以伪目标就是让编译器取消检查,可以直接连续操作。
现在来推导一下编译过程,上面的过程可以看成下面的内容。

保存并退出Makefile文件。
先使用make命令,再运行可执行文件,最后使用make clean

上面的过程是

但在实际编写时只需要下面的方式

Makefile:

但是现在的Makefile还是有局限性,就只能编译1个C语言文件。
现在来进行最终修改。

先解释前面5行的内容

现在把第8行到第14行的内容进行修改:

先使用make命令,再运行可执行文件,最后使用make clean

现在还是没有解决只能编译一个文件的问题。

当前目录下有多个后缀为.c,我们现在的目标就是这些文件编译形成一个可执行文件。

当我们在使用make命令时,依赖方法会显示到屏幕上。若不想显示到屏幕上,在依赖方法前面加上符号@ 就可以不显示



现在开始编写代码:

但现在我们还没有.o文件,所以需要通过依赖关系和依赖方法来生成.o文件


有了依赖关系还需要依赖方法

最后删除所有的.o文件和可执行程序


感谢观看!