1、什么是makefile
在一个大型工程中,工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
通俗一点理解就类似于windows下的IDE。
2、makefile优势与make命令
1、优势
makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率
比如说:我们的工程有 8 个 C 文件,和 3 个头文件,我们要写一个 Makefile 来告诉 make 命令如何编译和链接这几个文件。我们的规则是:
- 如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。
- 如果这个工程的某几个 C 文件被修改,那么我们只编译被修改的 C 文件,并链接目标程序。
- 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件,并链接目标程序。
2、make命令
- make会在当前目录下找名字为“Makefie”或者“makefile”的文件
- =如果找到,从文件中第一个目标文件,就是上面例子中的main文件,并把这个文件作为最终的目标可执行文件
-
如果main不存在,或者说main所依赖的后面.o文件的文件修改时间比main文件新,那么它就会执行后面所定义的命令来生成main这个文件
- 这样就生成了可执行文件mian,可以运行
3、makefile文件内容
为了讲解清楚其工作原理, 我们首先说一下之前我们常用的对文件的编译方式。
首先,我们在同一个文件夹里面创建多个.c文件和.h文件。如下:
通常情况下,我们对文件的编译是如下方式
会挨个挨个的把.c文件写入,但是如果当我们的文件数量过大时该怎么办呢?还有,如果经过编译之后,我们又对sub.c文件进行修改了,再重新编译的时候,如果只对sub.c文件进行编译这样是不对的如下图所示:
应该再把所有.c文件进行再次编译才是正确的。这样一想,我们之前对文件的编译方式似乎有些不妥,在此我们引出了makefile文件,有了他,在默认的方式下,也就是我们只输入 make 命令即可对所有.c文件进行编译。
3.1makefile文件的基础写法
1、只生成一个main的可执行文件时
makefile文件的基本内容如下:
- main后面跟的就是main执行要依赖的文件
- 后面紧接着写每个所要依赖的.o文件生成的过程
【注意】
空出来的部分是tab键。
输入make过后,完成连接过程如下:
【注意】
make clean操作主要是把里面的.o文件和main进行删除,效果如下:
2、生成两个main、run的可执行文件时
如果此时我们再往里面加入一个run.c文件,生成两个main、run的可执行文件,makefile文件的基本内容如下:
make过后所生成的文件内容如下:
随后运行两个可执行文件
3.2 makefile文件的优化
1、make的隐式推导
GUN的make很强大,他可以自动推导文件以及文件依赖关系后面的命令,因此我们就没有必要去在每一个.o文件后面都写上类似的命令
2、CC环境变量指定编译工具
可以通过改变CC来指定编译器,所以我们可以把makefile文件更新如下:
更进一步,我们可以用类似于宏一样的方式,替换标签后面所跟的依赖文件makefile文件的进一步改进如下:
3、VPATH环境变量指定搜索路径
还有注意,最后只需要的是可执行文件,中间的.o文件等是不需要的,要进行clean.
最后的优化版本如下: