转自:http://www.avrtool.com/avr/avrt/hjkf/200904/1542.html
makefile对于溺于IDE下的朋友们一定接触的不多,因为IDE把建立makefile的任务一手包办了,但常期以往沉浸于IDE的溺爱是对发展非常不利的,特别是在unix下和makefile打交道是更为普遍,所有学会写makefile是非常有必要的。
在IDE下,系统之所以能井然有序的对众多源代码进行编译和链接,是因为IDE很明确的告诉系统先做什么而后做什么。而makefile就是一个传播这些信息媒介,而我们现在的目标抛离IDE的怀怉,返璞归真。
这里是官方make参考文档中makefile一章,关于makefile的方方面面可谓是面面惧到,非常适合看到E文不头疼的朋友和即使头疼也要看的朋友http://www.gnu.org/software/make/manual/make.html#Makefiles
准备工具和文件
hello.c
#include <stdio.h>当hello.c输入完成后,我们要对hello.c进行编译,需要执行
int main(int argc,char* argv[])
{
printf("hello world\n");
return 0;
}
gcc hello.c
初任务:建立一个makefile,使用make代替以上的过程。
# 最简单的makefile当makefile建立完成后放至hello.c所在的文件夹,执行make,看看发现了什么。
hello: hello.c
gcc hello.c
#注意 hello前与gcc前的是[TAB]而不是空格
make执行了gcc hello.c成功的完成了编译我们回首分析那个makefile发现执行单元由3个部分组成
<目标名称>:<需要的文件>
<命令>
我们对makefile进行改写,以更能容易描述这三个单元
#次简单的makefile删除目录下的hello.o后再执行make后发现了什么?
hello: hello.o
gcc hello.o -o hello
hello.o: hello.c
gcc -c hello.c -o hello.o
系统执行了
gcc -c hello.c -o hello.o
gcc hello.o -o hello
对比makefile我们很容易发现hello的建立过程为
hello <- hello.o <- hello.c
任务二:关联多个源文件的makefile
对单个文件大家可能没有体会到优势,那么我们新引入一个func.c 与 func.h 文件并修改hello.c
/*hello.c*/并修改相应的makefile为
#include "func.h"
int main(int argc,char* argv[])
{
func();
return 0;
}
/*func.c*/
#include "func.h"
void func(void)
{
printf("hello world\n");
}
/*func.h*/
#ifndef _FUNC_H
#define _FUNC_H
#include <stdio.h>
void func(void);
#endif
#任务二的makefile运行make后输出
hello: hello.o func.o
gcc hello.o func.o -o hello
hello.o: hello.c
gcc -c hello.c -o hello.o
func.o: func.c func.h
gcc -c func.c -o func.o
gcc -c hello.c -o hello.o执行过程为
gcc -c func.c -o func.o
gcc hello.o func.o -o hello
hello<-hello.o<-hello.c
^--func.o<-hello.c
通过任务一和任务二,我相信大家一对makefile最最基本的规则有了个明确的了解。不过这仅仅只是序幕。下一章我们将使用make的特性开始对makefile修改,以简化和自动化我们书写代码的过程。
makefile相比较c来讲还是相当的简单的