转载: https://www.linuxidc.com/Linux/2014-08/105304.htm
Makefile入门教程
回顾
首先,我把需要的文件全部写出来(在《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的功能,大家可以根据自己日后的需求自行学习。
Linux程序设计(原书第2版)(PDF中文版 + 源码) http://www.linuxidc.com/Linux/2011-04/34147.htm
<https://www.linuxidc.com/Linux/2011-04/34147.htm>
u-boot Makefile完全解读 http://www.linuxidc.com/Linux/2013-04/83529.htm
<https://www.linuxidc.com/Linux/2013-04/83529.htm>
实验平台上Makefile详细的解释 http://www.linuxidc.com/Linux/2014-01/94827.htm
<https://www.linuxidc.com/Linux/2014-01/94827.htm>
Makefile之Linux内核模块的Makefile写法分析 http://www.linuxidc.com/Linux/2013-06/85842.htm
<https://www.linuxidc.com/Linux/2013-06/85842.htm>
Makefile之写demo时的通用Makefile写法 http://www.linuxidc.com/Linux/2013-05/84679.htm
<https://www.linuxidc.com/Linux/2013-05/84679.htm>
Makefile之大型工程项目子目录Makefile的一种通用写法
http://www.linuxidc.com/Linux/2013-05/84678.htm
<https://www.linuxidc.com/Linux/2013-05/84678.htm>
本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-08/105304.htm
<https://www.linuxidc.com/Linux/2014-08/105304.htm>
<http://www.linuxidc.com/>
热门工具 换一换