Makefile的规则
目标 : 需要的条件 (注意冒号两边有空格)
命令(注意前面用tab键开头)
解释一下:
1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。
2 需要的条件就是生成目标所需要的文件或目标
3 命令就是生成目标所需要执行的脚本
总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。
下面举个简单的例子说明。如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。
edit : main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
下面来说说自己的总结:
我写了三个文件:hello.c test.c test.h。内容如下:
hello.c:
#include <stdio.h>
#include "test.h"
void main(void)
{
char s[] = "Bye~";
printf("Hello World!\n");
test(s);
}
test.h:
#ifndef __TEST_H_
#define __TEST_H_
#include <stdio.h>
int test(char *s);
#endif
test.c:
#include "test.h"
int test(char *s)
{
printf("%s...\n",s);
return 1;
}
makefile如下:
main : hello.o test.o
gcc -o main1 hello.o test.o
hello.o : hello.c
gcc -c hello.c
test.o : test.c test.h
gcc -c test.c
clean :
rm hello.o test.o
其中,第一行的main只是一个标签,怎样写都可以。第二行的main1才是最终生成的目标文件,并且目标和依赖的位置可以互换,比如:
gcc hello.o test.o -o main1
如果工程中包含头文件,只需要在第一行的依赖中写出来,第二行不用写:
test.o : test.c test.h
gcc -c test.c
make完了之后再make clean一下,清除临时文件。