今天尝试编写一个简单的Makefile,偶然发现了用vim原来这么顺手。看来以后免不了还要倒腾一番。
上图,这是要编辑的几个文件内容。
如下是几个文件的代码:
add.h
/*
@filename add.h
*/
#ifndef _ADD_H
#define _ADD_H
int add(int a, int b);
#endif
gcd.h
/*
@filename gcd.h
*/
#ifndef _GCD_H
#define _GCD_H
int gcd(int a, int b);
#endif
/*
@filename add.c
用途:计算两个数的和
*/
#include "add.h"
int add(int a, int b)
{
return a+b;
}
/*
@filename gcd.c
用途:计算两个数的最大公约数
*/
#include "gcd.h"
int gcd(int a, int b)
{
int c;
while(b)
{
c = a % b;
a = b;
b = c;
}
return a;
}
/*
@author kehr
@time 2013.11.11
@filename main.c
用于练习Makfile的编写
*/
#include <stdio.h>
#include "gcd.h"
#include "add.h"
int main()
{
int a,b;
while(1)
{
printf("(end with 0 0)input 'a' and 'b':");
scanf("%d %d",&a,&b);
if(a==0 && b==0)break;
printf("%d 和 %d的最大公约数是:%d\n",a,b,gcd(a,b));
printf("%d 和 %d的最小公倍数是:%d\n",a,b,a*b/gcd(a,b));
printf("%d 和 %d的和是:%d\n",a,b,add(a,b));
}
}
Makefile
#编译main.c add.c gcd.c 生成 main文件
#定义变量
O_FILE = main.o add.o gcd.o
main:$(O_FILE)
gcc -o main $(O_FILE)
main.o: main.c add.h gcd.h
gcc -c main.c
add.o:add.h add.c
gcc -c add.c
gcd.o:gcd.h gcd.c
gcc -c gcd.c
clean:
rm $(O_FILE)
Makefile的简单知识:
1.在Makefile中#开始的行都是注释行.
2.Makefile中最重要的是描述文件的依赖关系的说 明.
一般的格式是:
target: components
TAB rule
//第一行表示的是依赖关系.
//第二行是规则(任意的Shell命令)
这里的TAB指的是一次TAB键的点击
3.
target ... : prerequisites ...
command......1.
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command
prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
如果我们改变了“add.h”,那么,main.o、add.o都会被重编译,并且,可执行文件main会被重链接。
好了,笔记完成。
接下来看执行make命令后的效果: