【Linux】——makefile

一、什么是makefile

在一个大型工程中,工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

通俗一点理解就类似于windows下的IDE。

二、makefile优势与make命令

makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率

比如说:我们的工程有 8 个 C 文件,和 3 个头文件,我们要写一个 Makefile 来告诉 make 命令如何编译和链接这几个文件。我们的规则是:

  1. 如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。
  2. 如果这个工程的某几个 C 文件被修改,那么我们只编译被修改的 C 文件,并链接目标程序。
  3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件,并链接目标程序。

三、makefile文件内容

为了讲解清楚其工作原理, 我们首先说一下之前我们常用的对文件的编译方式。
首先,我们在同一个文件夹里面创建多个.c文件和.h文件。如下:
在这里插入图片描述
通常情况下,我们对文件的编译时如下方式
在这里插入图片描述
会挨个挨个的把.c文件写入,但是如果当我们的文件数量过大时该怎么办呢?还有,如果经过编译之后,我们又对sub.c文件进行修改了,再重新编译的时候,如果只对sub.c文件进行编译这样是不对的如下图所示:
在这里插入图片描述
应该再把所有.c文件进行再次编译才是正确的。这样一想,我们之前对文件的编译方式似乎有些不妥,在此我们引出了makefile文件,有了他,在默认的方式下,也就是我们只输入 make 命令即可对所有.c文件进行编译。

1、makefile文件的基础写法

只生成一个main的可执行文件,makefile文件的基本内容如下:
在这里插入图片描述
其中main后面跟的就是main执行要依赖的文件,后面紧接着写每个所要依赖的.o文件生成的过程。且前面空出来的部分是tab键。
输入make过后,完成连接过程如下:
在这里插入图片描述
注意!make clean操作主要是把里面的.o文件和main进行删除,效果如下:
在这里插入图片描述
如果此时我们再往里面加入一个run.c文件,生成两个main、run的可执行文件,makefile文件的基本内容如下:
在这里插入图片描述
make过后所生成的文件内容如下:
在这里插入图片描述
随后运行两个可执行文件
在这里插入图片描述

2、makefile文件的优化

1、make的隐式推导
GUN的make很强大,他可以自动推导文件以及文件依赖关系后面的命令,因此我们就没有必要去在每一个.o文件后面都写上类似的命令
2、CC环境变量指定编译工具
可以通过改变CC来指定编译器,所以我们可以把makefile文件更新如下:
在这里插入图片描述
更进一步,我们可以用类似于宏一样的方式,替换标签后面所跟的依赖文件,makefile文件的进一步改进如下:
在这里插入图片描述
3、VPATH环境变量指定搜索路径
还有注意,最后只需要的是可执行文件,中间的.o文件等是不需要的,要进行clean.
最后的优化版本如下:
在这里插入图片描述

发布了98 篇原创文章 · 获赞 9 · 访问量 3652

猜你喜欢

转载自blog.csdn.net/qq_43412060/article/details/105365712
今日推荐