一、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.赋值符"="
使用"="再给变量的赋值的时候,不一定要用已经定义好的值,也可以使用后面定义的值,例如:
(加上@表示不展示命令执行过程)

Makefile要输出一串字符的话使用**echo**,就和C语言的**printf**一样

**=**可以借助另一个变量,将变量的真实值推到后面去定义


2.赋值符":="
将上述例子中的=改为:=,再次运行


赋值符":=“不会使用后面定义的变量,只能使用前面已经定义好的,这就是”=“和”:="两个的区别。
3.赋值符"?="
如果前面没有被赋值,那么就是?=后的变量,如果之前已经被赋值了,那么就使用前面赋的值。
4.变量追加"+="

Makefile模式规则


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



其中@,@,@,<和$^,是我们最常用的三种
因此,使用通配符就需要这样写

Makefile伪目标


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

通过指令.PHONY:clean 将clean文件设为伪目标,使得指令可以继续生效

本文介绍了在源码较多时,如何使用make工具和Makefile进行自动化编译。make工具根据Makefile文件提供的编译规则,智能判断哪些文件需要重新编译。Makefile的基本规则包括依赖文件的检查和编译指令。当修改部分源文件时,仅编译改动的部分,若头文件被修改则编译所有引用它的源文件。此外,文章还详细讲解了Makefile中的规则格式、变量赋值、通配符使用以及伪目标,展示了如何通过Makefile实现高效、智能的编译流程。
996

被折叠的 条评论
为什么被折叠?



