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

感谢观看!

相关推荐
冉佳驹2 小时前
Linux ——— 静态库和动态库的设计与使用
linux·动态库·静态库·fpic
陌上花开缓缓归以2 小时前
linux mtd-utils使用源码分析(ubuntu测试版)
linux·arm开发·ubuntu
wangjialelele3 小时前
Linux下的IO操作以及ext系列文件系统
linux·运维·服务器·c语言·c++·个人开发
非凡ghost3 小时前
PowerDirector安卓版(威力导演安卓版)
android·windows·学习·软件需求
HypoxiaDream3 小时前
LINUX-Ext系列⽂件系统
linux·运维·服务器
小毛驴8503 小时前
Linux curl 命令用法
linux·运维·chrome
李斯啦果3 小时前
【Linux】Linux目录配置
linux·运维·服务器
AI+程序员在路上3 小时前
linux下线程中pthread_detach与pthread_join区别
linux·运维·服务器
代码游侠3 小时前
C语言核心概念复习——C语言基础阶段
linux·开发语言·c++·学习