一、make工具和Makefile文件的引入

&emsp 当源码文件比较多的时候就不适合通过直接输入gcc命令来编译,这时候就需要一个自动化的编译工具。
make:一般说GNU Make,是一个软件,用于将源代码文件编译为可执行的二进制文件,make工具主要用于完成自动化编译。make工具编译的时候需要Makefile文件提供编译文件。
Makefile:make 工具所使用的文件,Makefile指明了编译规则。

1.make工具

利用make工具可以自动完成编译工作,这些工作包括:
· 如果修改列某几个源文件,则只重新编译这几个源文件
**·**如果某个头文件被修改了,则重新编译所有包含该头文件的源文件
利用这种自动编译可以大大简化开发工作,避免不必要的重新编译,make工具通过一个成为Makefile的文件来完成并自动维护编译工作,Makefile文件描述了整个工程的 编译,连接规则。

2.Makefile文件

Makefile描述了整个工程的编译连接规则。Makefile 的基本规则为:
在这里插入图片描述

二、编写C程序

1.源程序部分

编写一个小型的含有多个.c文件的C程序。
main.c
在这里插入图片描述
calcu.c
在这里插入图片描述

input.c
在这里插入图片描述
input.h
在这里插入图片描述

calcu.h
在这里插入图片描述
编译文件
在这里插入图片描述
执行文件
在这里插入图片描述

2.对其中部分文件的修改

首先生成所有文件的.o
在这里插入图片描述
在这里插入图片描述

加入只是对其中的calcu.c进行了修改,那么只需要重新在这里插入图片描述
在这里插入图片描述

即可

三、使用make工具和Makefile文件编译

如果修改的文件过多,以至于想不起哪个文件被修改过,为此我们需要一个工具:
1.如果工程没有编译过,那么工程中的所有.c文件都要被编译并且连接成可执行文件。
2.如果工程中只有个别C文件被修改了,那么质变仪这些被修改的C文件即可。
3.如果工程的头文件被修改了,那么我们需要编译所有引用这个头文件的C文件,并且连接成可执行文件。

为此我们需要一个Makefile,在工程目录下创建名为"Makefile"的文件,文件名一定要叫做"Makefile"区分大小写
在这里插入图片描述

1.Makefile 规则格式

在这里插入图片描述

例如:
在这里插入图片描述

这同时也是我们之后通过 vi Makefile 命令,在Makefile文件中所撰写的程序。

在所有 .c文件未被编译成 .o文件之前,我们可以通过make命令将所有的.c统一编译:
在这里插入图片描述
同样的 ,输入 ./main 来执行程序
在这里插入图片描述

倘若之后再对其中的某些程序进行修改,再次使用make命令,Makefile会帮助自动完成(根据最后修改日期是否变动,即使是多增加一个空格)

图中就是只对input.c 进行了修改,make命令能够自动识别

Makefile基本语法

1.Makefile规则格式

在上一小点也已经说过了,这里再提一下
在这里插入图片描述
首先检查依赖文件是否都在,通过,则按具体命令执行具体规则
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2. Makefile变量

在这里插入图片描述
在这里插入图片描述

Makefile变量的赋值

Makefile变量的赋值符还有其他两个 :=?=

1.赋值符"="
使用"="再给变量的赋值的时候,不一定要用已经定义好的值,也可以使用后面定义的值,例如:
(加上@表示不展示命令执行过程)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9ba74c73f3d74591819d08e672e373df.png)
Makefile要输出一串字符的话使用**echo**,就和C语言的**printf**一样

在这里插入图片描述

**=**可以借助另一个变量,将变量的真实值推到后面去定义
在这里插入图片描述

在这里插入图片描述

2.赋值符":="

将上述例子中的=改为:=,再次运行
在这里插入图片描述

在这里插入图片描述
赋值符":=“不会使用后面定义的变量,只能使用前面已经定义好的,这就是”=“和”:="两个的区别。

3.赋值符"?="

如果前面没有被赋值,那么就是?=后的变量,如果之前已经被赋值了,那么就使用前面赋的值。

4.变量追加"+="

在这里插入图片描述

Makefile模式规则

在这里插入图片描述
在这里插入图片描述
对于通配符而言,我们不能通过 -c %.c 来进行统一编译,应为-c需要准确的文件名,为此我们引入自动化变量(不能想下图那样写)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
其中 @ , @, @,<和$^,是我们最常用的三种
因此,使用通配符就需要这样写
在这里插入图片描述

Makefile伪目标

在这里插入图片描述
在这里插入图片描述
如果不小心手贱,创建了一个clean文件(通过ls命令我们可以看出该文件已经存在),那么make clean指令将不再有效
在这里插入图片描述

通过指令.PHONY:clean 将clean文件设为伪目标,使得指令可以继续生效
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐