Makefile入门教程


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中文版 + 源码)

u-boot Makefile完全解读

实验平台上Makefile详细的解释

Makefile之Linux内核模块的Makefile写法分析

Makefile之写demo时的通用Makefile写法

Makefile之大型工程项目子目录Makefile的一种通用写法

本文永久更新链接地址:

相关内容