回顾

首先,我把需要的文件全部写出来(在《gcc学习笔记》处)。

 main.c文件

#include <stdio.h>
#include "math.h"
int main()
{
int sum = 0;
sum = add(4, 3);
printf("sum:%d", sum);

int result = 0;
result = divide(4, 0);
printf("result:%d\n", result);
return 0;
}

add.c文件

#include "math.h"

int add(int x, int y)
{
return x + y;
}

divide.c文件

#include <stdio.h>

#include "math.h"
int divide(int x, int y){
if(y == 0){
printf("y can't be zero\n");
return 0;
}
return x / y;
}

minus.c文件

#include "math.h"

int minus(int x, int y){
return x - y;
}

multiply.c文件

#include "math.h"

int multiply(int x, int y){
return x * y;
}

math.h文件

int add(int x, int y);

int minus(int x, int y);

int divide(int x, int y);

int multiply(int x, int y);

现在,在我的当前目录下有main.c   add.c   minus.c   divide.c   multiply.c 和math.h六个文件,下面的内容就会围绕这几个文件来举例讲述。

问题

在《gcc学习笔记》一节,我已经提到过,如果要对add.c    minus.c  divide.c   multiply.c这四个中其中一个作修改,那么就需要重新编译相应的源文件,生成新的目标文件,然后再进行链接,才可以生成修改后的执行文件。大家想想,如果说我们做的是一个大工程,那文件可是成千上百个啊!如果我们还是像现在这样,一个个地重新编译文件,那效率是极其低下的。于是就出现了makefile工具解决这个问题。

什么是makefile

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令.

使用规则

目标文件 : 先决条件

                  命令

目标文件:可以是object file、可执行文件或者是一个标签

先决条件:生成目标文件所需的目标或文件

命令:要执行的命令

这里要注意的是:命令这一行需要tab键开头,否则编译器是无法识别的。

makefile的执行,是通过比较目标文件和先决条件这两部分文件的日期,如果先决条件文件日期比较新或者目标文件不存在,那么makefile就会去执行后续定义的命令

实例

创建并编辑makefile文件(也可以命名为Makefile)

以下,我将makefile文件截图,如下:

​如果命令行不是以tab键开始,vim编辑器是会有些提醒的。

​在颜色上就没有变棕色了。

这里,我就拿下面这部分代码来说明

add.o : add.c  math.h

gcc -c add.c

在上面,我们看add.c代码知道,add.c包含了math.h这个头文件,故它也是目标文件的先觉条件。

在执行前,会先比较add.o和add.c、math.h这两部分文件的日期,如果add.c或math.h文件日期比add.o新,或者add.o目标文件不存在,那么就会执行下面gcc -c add.c这个命令。

另外要说的一个是下面这段代码

clean:
rm calculate main.o add.o divide.o minus.o multiply.o

clean在这里不是一个文件,是一个标签,它冒号后面什么也没有,那就是说make不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。

这里clean的作用是删除可执行文件和目标文件。如果想要执行这一命令,直接用make clean即可。如果要生成可执行文件,则执行make

以上的内容,只是介绍makefile的最常用功能。如果想更深入地探讨makefile的功能,大家可以根据自己日后的需求自行学习。

 

打赏

发表评论

电子邮件地址不会被公开。