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文件和可执行程序

感谢观看!

相关推荐
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo4 天前
Linux 彻底且安全地删除文件
linux
用户805533698034 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297914 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
Web3探索者6 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo6 天前
Linux系统中网线与USB网络共享冲突
linux
Sokach10157 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
AlfredZhao8 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3109 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql