#1、Makefile的规则:
# target... : prerequisites...
# command
target是:【目标文件:包含执行文件edit与中间目标文件(*.o)文件】
prerequisites是: 【依赖文件:包含冒号后面那些.c文件与.h文件;edit的依赖文件是所有.o文件】
command是:【命令:定义了如何生成目标文件的操作系统命令,一定要以Tab键作为开头】
#2、make什么时候执行command命令?
# make会比较targets文件和prerequisites文件的修改日期,如果prerequisutes文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令
#3、clean不是一个文件,它不过是一个动作名字,有点像c语言中的lable一样,
# 其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令
# 要执行其后的命令,就要在make命令后明显的指出这个lable的名字。
# 为了避免和文件重名的这种情况,我们可以使用一个特殊标记".PHONY"来显示地知名一个目标是"伪目标"
# 向make说明,不管是都有这个文件,这个目标就是"伪目标"
a.c a.h b.c b.h common.h文件代码如下:
#a.c
[root@localhost MakeFile]# cat a.c
#include "common.h"
#include "a.h"
int main(void)
{
printf("aaa\n");
testb();
printf("a:%d\n", strlen("asafxxxxxx"));
return 0;
}
#a.h
[root@localhost MakeFile]# cat a.h
#include <stdio.h>
#b.c
[root@localhost MakeFile]# cat b.c
#include "common.h"
#include "b.h"
void testb(void)
{
printf("bbb\n");
printf("b:%d\n", strlen("asaf"));
return ;
}
#b.h
[root@localhost MakeFile]# cat b.h
#include <stdio.h>
#common.h
[root@localhost MakeFile]# cat common.h
#include <string.h>
#include <unistd.h>
Makefile文件代码如下:
export CC=gcc
all:edit
@echo "all"
edit:b.o a.o
@$(CC) a.o b.o -o edit
@echo "edit"
a.o:a.c a.h common.h
@$(CC) -c a.c -o a.o
@echo "a.o"
b.o:b.c b.h common.h
@$(CC) -c b.c -o b.o
@echo "b.o"
.PHONY:clean
clean:
@rm a.o b.o edit -f
# 4、make是如何工作的?
# 若工程首次被编译:
# 1》make会在当前目录下找到"Makefile"的文件;
# 2》如果找到,就会找文件中的第一个目标文件(target),在上面的例子中找到"all"这个文件;
# 3》"all"所需的目标是"edit","edit"文件所需文件都为[.o]文件,所以此文件作为最终的目标文件;
# 4》如果edit文件不存在,或者是edit所依赖的后面的[.o]文件的文件修改时间要比edit这个文件新,
# 那么,他就会执行后面所定义的命令来生成edit这个文件;
# 5》如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,
# 如果找到,则再根据那一个规则生成.o文件;
# 6》执行edit文件。
结果如下:
[root@localhost MakeFile]# make -f 1_makefile.bak
b.o
a.o
edit
all
[root@localhost MakeFile]# ./edit
aaa
bbb
b:4
a:10
#
#
# 若工程未被编译过:
# 打印结果为: b.o >然后是> a.o >然后是> edit >然后是> all
# 若编译好后,只是修改了a.h文件:
# 打印结果为: a.o >然后是> edit >然后是> all
#
# make的工作方式:
# 1》读入所有的Makefile
# 2》读入被include的其他的Makefile
# 3》初始化文件中的变量
# 4》推导隐晦规则,并分析所有规则
# 5》为所有的目标文件创建依赖关系链
# 6》依据依赖关系,决定那些目标要重新生成
# 7》执行生成命令