6_Linux学习总结_自动化构建

自动化构建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文件和可执行程序

感谢观看!

相关推荐
SudosuBash4 小时前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI14 小时前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行1 天前
Linux和window共享文件夹
linux
木心月转码ing2 天前
WSL+Cpp开发环境配置
linux
崔小汤呀3 天前
最全的docker安装笔记,包含CentOS和Ubuntu
linux·后端
何中应3 天前
vi编辑器使用
linux·后端·操作系统
何中应3 天前
Linux进程无法被kill
linux·后端·操作系统
何中应3 天前
rm-rf /命令操作介绍
linux·后端·操作系统
何中应3 天前
Linux常用命令
linux·操作系统
葛立国3 天前
从 / 和 /dev 说起:Linux 文件系统与挂载点一文理清
linux