makefile简介

makefile

一、什么是makefile?

make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。

二、为什么需要makefile?

如果不用 makefile,每次编译、链接都需要手动敲的很多命令。当工程量很大时,编译整个工程需要花很久。而且我们并不是每次都修改了所有源文件,因此希望程序自动编译那些被修改的源码,而没被修改的部分不要浪费时间重新编译。makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,大大提高了软件开发的效率。

三、使用流程

①我们要先在程序目录下创建一个Makefile文件。
②编写Makefile。
③命令行输入make,编译成功。

四、makefile的规则

程序示例:
1、main.c:

#include 
#include “math.h”
int main()
{
     int n1 = 1, n2 = 10;
     printf(“从%d加到%d的和为%ld\n”, n1, n2, sum(n1, n2));
     printf(“OS:%s”,OS);
     getchar();
     return 0;
}

2、math.c:

#include 
long sum(int fromNum, int endNum)
{
    int i;
    long result = 0;
    if(fromNum<0 || endNum<0 || endNum<fromNum)
    {
         return -1;
     }
         for(i=fromNum; i<=endNum; i++)
     {
         result += i;
     }
     return result;
}

3、math.h

 #ifndef _MATH_H
 #define _MATH_H
 #define OS “Linux”
 extern long sum(int, int);
 #endif

Makefile第一版:

demo: main.o math.o             #demo为要生成的可执行文件
    gcc -o demo main.o math.o     #main.o math.o中间目标文件
main.o: main.c math.h           #main.c math.c math.h为依赖文件
  	gcc -c main.c
math.o: math.c
	gcc -c math.c
.PHONY : clean                 # .PHONY 表示 clean 是个伪目标文件
clean :                               # clean 不是一个文件,它只不过是一个动作名字
   -rm demo main.o math.o    # - 表示某些文件出现问题,但不要管,继续做后面的事

总结
可以看到 .o 文件的字符串被重复了三次,如果我们的工程需要加入一个新的 .o 文件,那么我们需要在三个地方加会很麻烦。

Makefile第二版:

 #声明一个变量,叫 objects。makefile中以 $(objects) 的方式来使用这个变量
objects=main.o math.o        
demo: $(objects)
   gcc -o demo $(objects)
main.o : main.c math.h
   gcc -c main.c
math.o : math.c
   gcc -c math.c
.PHONY : clean
clean :
   -rm demo $(objects)

总结:
为了makefile的易维护,我们在 makefile中加了一个变量objects ,如果有新的 .o 文件加入,我们只需简单地修改一下 objects 变量就可以了。但是我们要在每一个 .o 文件后都写上类似的命令,依然很麻烦。

Makefile 第三版:

objects=main.o math.o        
demo: $(objects)
   gcc -o demo $(objects)
main.o : math.h
.PHONY : clean             
clean :
   -rm demo $(objects)

总结:
make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个 .o 文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。

补充:
①反斜杠( \ )是换行符的意思;
如:object : main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
②在Makefile中的命令,必须要以 Tab 键开始;
③#号为注释;
④如果要删除执行文件和所有的中间目标文件,命令行输入make clean 就可以了。

五、make是如何工作的?

1、make会在当前目录下找名字叫“Makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件,在上面的例子中,他会找到“demo”这个文件,并把这个文件作为最终的目标文件。
3、如果demo文件不存在,或是demo所依赖的后面的 .o 文件的文件修改时间要比 demo 这个文件新,那么,他就会执行后面所定义的命令来生成 demo 这个文件。
4、如果 demo 所依赖的 .o 文件也不存在,那么make会在当前文件中找目标为 .o 文件的依赖性(.c和.h文件),找到则再根据那一个规则生成 .o 文件。
5、make生成 .o 文件,然后再用 .o 文件生成执行文件demo。

详细讲解可以参考 陈皓大神的跟我一起写 Makefile:https://blog.csdn.net/haoel/article/details/2886

你可能感兴趣的:(makefile)