make与Makefile文件浅析

        make是一个给编译大量源码提供便捷的工具,其本身并没有编译源码的功能。它是通过调用gcc工具实现大量文件编译的,解决了项目中因某个文件的修改,而需要全部重新编译的问题。

        Makefile文件是按照make工具中规定的编写格式编写的文件,在Linux系统中,按 make 规则名 来执行Makefile中编写的规则,其中第一条规则可直接用 make 执行。Makefile文件的基本格式为:

        规则名1:目标文件

                Linux指令

        规则名2:目标文件

                Linux指令

如:

执行结果如下:

注意:Makefile文件的每行开头要按tab键空格 

        Linux执行make命令,实际是执行make main命令,main规则又依赖main.o,jia.o,input.o三个文件,于是往下面的规则中找,并且找到了生成上述三个文件的规则,于是Linux实际执行的命令是

示例中main.o  jia.o  input.o  重复写了两次,属于重复性工作,可以通过变量来去除重复性工作。

1.变量

         格式:变量名 = 字符串,之后Makefile文件中需要用到变量名所表示的内容时,统一用 $(变量名) 来表示,如:

         变量名与字符串之间的赋值符不同,产生的效果也不同。

1.1赋值符 “=”

        引用变量时使用赋值符“=”时,会以变量最后一次赋值的结果作为变量的值。

1.2赋值符 “:="

        引用变量使用赋值符 “:="时,会以引用该变量时最近的一次赋值结果作为变量的值。

 

1.3赋值符“?=”

        赋值符“?=”表示若变量之前没有赋值,则以当前值作为变量的值,若变量之前有赋值,则保持原来的值。

1.4赋值符“+=”

        “+=”表示变量在原有的值上进行追加。 

2.Makefile模式规则

        Makefile文件中,每编译一个源文件,对应着一个规则命令。为编写简洁,Makefile文件用%来代替所有同一类型的文件,如%.o表示同一目录下所有 *.o类型的文件,a.%.c表示同一目录下所有 以a开头,以.c结尾类型的文件。上述编译 .c文件的规则行可以改成 %.o: %.c,但是命令行gcc -c xx.c中的xx.c不能用%.c代替,所以需要引入自动化变量。

3.Makefile自动化变量

        目标和和依赖都是一系列文件,Makefile每解析一条规则,都要依赖文件生成对应的目标文件。自动化变量可以用一条命令,实现从不同的依赖文件中生成对应的目标文件。

示例中的Makefile文件可以简写为:

模式规则与自动化变量结合,简化了Makefile文件的代码量。

4.Makefile伪目标

        Makefile文件的“真目标” 都有与之对应的依赖文件,而Makefile文件中还有一种没有对应依赖文件的目标——伪目标,它不需要生成对应的目标文件,只是为了执行规则下的命令,如示例中的clean。

        但当Makefile文件的同一目录下存在clean文件时,由于解析clean规则时发现目录中已存在clean文件,而跳过规则中的命令行,提示clean文件已更新。为防止这一情况的发生,Makefile文件中引入了伪目标声明。

         伪目标声明是为了防止工程中存在与伪目标同名的文件而不执行伪目标下的命令,其格式为

.PHONY:目标名

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值