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一下,清除临时文件。