make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。
如果不用 makefile,每次编译、链接都需要手动敲的很多命令。当工程量很大时,编译整个工程需要花很久。而且我们并不是每次都修改了所有源文件,因此希望程序自动编译那些被修改的源码,而没被修改的部分不要浪费时间重新编译。makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,大大提高了软件开发的效率。
①我们要先在程序目录下创建一个Makefile文件。
②编写Makefile。
③命令行输入make,编译成功。
程序示例:
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 就可以了。
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