Makefile各类符号

makefile总规则:欲更新目标,必须首先更新它的所有条件; 
命令列表中的每条命令必须以一个Tab开头,注意不能是空格,Makefile的格式不像C语言的缩进那么随意,对于Makefile中的每个以Tab开头的命令,make会创建一个Shell进程去执行它, 
在大型项目中gcc的-M选项自动生成目标文件和源文件的依赖关系

冒号表示,
main: main.o stack.o maze.o #目标:条件 
gcc main.o stack.o maze.o -o main #执行的命令 
main.o: main.c main.h stack.h maze.h 
gcc -c main.c 
stack.o: stack.c stack.h main.h 
gcc -c stack.c 
maze.o: maze.c maze.h main.h 
gcc -c maze.c 
红色部分是makefile 的理念,很重要: 
执行makefile的时候会尝试更新makefile的第一条规则,第一条规则的目标称为缺省目标,只要缺省目标更新了就算完成任务,而要更新缺省目标,需要先更新缺省目标的条件。所以总结的一点就是,makefile类似堆栈,由下而上的执行makefile。

重新编译的时候只编译受影响的文件。
执行makefile重新编译的时候,仍然尝试更新缺省目标,继而取更新目标的条件目标,重新编译的条件是被修改的文件的修改时间若是最新的,则需要重新编译相关联的文件,这样受影响的目标条件被更新了,那么缺省目标也也就需要重新编译。即,以下情况下要更新

makefile的命名规则
执行make命令时,是按照GNUmakefile、makefile、Makefile的顺序找到第一个存在的文件并执行它,不过还是建议使用Makefile做文件名。除了GNU make,有些UNIX系统的make命令不 
是GNU make,不会查找GNUmakefile这个文件名,如果你写的Makefile包含GNU make的特殊语法,可以起名为GNUmakefile,否则不建议用这个文件名。

@,%,^,<,-,$()等符号的说明
@: 
如果执行命令前加上它,则只显示命令结果,不显示命令本身 
-: 
通常makefile里的命令执行出错(该命令的退出状态非0),就立刻终止makefle的执行。但是在命令前加上’-‘,即便命令出错makefile还会执行。通常rm命令和mkdir命令前面要加-号。

.phony 关键字
在目标前添加它,表示该目标是虚假目标,即伪目标。不管它的目标文件存在不存在都要更新,即需要执行,想clean一样

$()
在makefile中使用$()获取makefile中定义的变量的值,如果变量没有定义其值为空,这样可以很好的控制编译时的参数。

$@
$@获取规则中的目标,规则实例:main.o:main.cq其中main.o是目标main.c是条件且是第一个条件

$<
$<获取规则中的第一个条件

$?
$?,表示规则中所有比目标新的条件,组成一个列表,以空格分隔。

$^
$^,表示规则中的所有条件,组成一个列表,以空格分隔。

%
%是替换字符,表示1个或者多个字符,实例:%.o:%.c这个实例称之为模式规则也是makefile的隐含规则

:= = ?= +=
:=表示立即展开,即立即进行赋值;=表示延迟展开,即若当前没有定义该变量,会需找定义再展开;?=表示如foo ?= (bar)的意思是:如果foo没有定义过,那么?=相当于=,定义foo的值是(bar)的意思是:如果foo没有定义过,那么?=相当于=,定义foo的值是(bar),但不立即展开;如果先前已经定义了foo,则什么也不做,不会给foo重新赋值;+=表示追加赋值,但同时保留变量赋值符号的特性,即采用:=进行赋值的话,那么+=保持:=的特性。 
一个变量的定义从=后面的第一个非空白字符开始(从(x)的(x)的开始),包括后面的所有字符,直到注释或换行之前结束。如果要定义一个变量的值是一个空格,可以这样: 
nullstring := (回车)
--------------------- 
作者:喧嚣里求静 
来源:优快云 
原文:https://blog.youkuaiyun.com/xingjiapeng/article/details/50388279 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值