Makefile —— Makefile的规则是什么?make是如何工作的?make的工作方式是什么?

#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》执行生成命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值