Makefile

1、makefile中的描述用于指导make程序如何完成工作

2、目标后的命令需要用Tab键隔开,make -f make.txt hello

3、makefile用于定义源文件之间的依赖,依赖可以省略,续行符'\'

4、当目标对应的文件不存在,执行对应命令;当依赖在时间上比目标更新,执行对应命令;当依赖关系连续发生时,对比依赖链上的每一个目标

5、@ 无回显字符

6、工程中可以将最终可执行文件名和all同时作为makefile中的第一条规则的目标(最新时可以减少编译)

7、默认情况下:make 认为目标对应者一个文件;make 比较目标文件和依赖文件的新旧关系,决定是否执行命令;make 以文件处理作为第一优先级。如果有文件跟目标同名可能会导致不执行目标下的命令(clean)

8、通过 .PHONY 关键字声明一个伪目标,伪目标不对应任何的实际文件,不管伪目标的依赖是否更新,命令总是执行

.PHONY : clean

##注释##

clean:

9、当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行,模拟函数调用

10、如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名;在执行此规则时,目标总会被认为是最新的(绕开依赖关键字)

clean : FORCE

    rm *.o hello.out

FORCE:

11、makefile 中的变量只代表文本数据(字符串);变量名可以包含字符,数字,下划线;不能包含:“:”,“#”,“=” 或者 “ ”;变量名大小写敏感;&(CC) 取变量值

12、变量的赋值方式:简单赋值(:=):单条语句有效,递归赋值(=):与之相关的都改变,条件赋值(?=):如果已经定义则失效,追加赋值(+=):原变量值与新值之间由空格隔开

13、预定义变量。自动变量:$@:当前规则中触发命令被执行的目标,$^:当前规则中的所有依赖,$<:当前规则中的第一个依赖;特殊变量:$(MAKE),$(MAKECMDGOALS),$(MAKEFILE_LIST),$(MAKE_VERSION),$(CURDIR),$(.VARIABLES):获取所有的特殊变量,。。。

14、“$” :可以表示转义“$$”;“$@”:输出时需要加上”\“:"\$@"

15、变量值的替换:使用指定字符(串)替换变量值中的后缀字符(串):$(var:a=b) 或者 ${var:a=b} ,表达式中不能有任何空格

16、make 中支持使用 ${} 对变量进行取值

17、变量的模式替换:使用%保留变量值中的指定字符,替换其他字符:$(var:a%b=x%y),表达式中不能有任何空格

18、规则中的模式替换:$(OBJS) :%.o : %.c

19、变量值的嵌套引用:本质是使用一个变量表示另外一个变量:$($(x))

20、可以在make 时在命令行定义变量;命令行变量默认覆盖makefile中定义的变量。override 关键字:用于指示makefile中定义的变量不能被覆盖,使用时变量的定义和赋值都需要使用override关键字

21、define ... endif :用于定义多行变量,等价与直接用=定义的变量

22、环境变量(全局变量):makefie中能够直接使用环境变量的值。定义了同名变量,环境变量将被覆盖;运行make时指定 ”-e“ 选项,优先使用环境变量

23、变量在不同的makefile之间的传递方式:直接在外部定义环境变量进行传递;使用 export 定义变量进行传递(定义临时环境变量);定义make命令行变量进行传递(推荐)

24、目标变量(局部变量):作用域只在指定目标及连带规则中

25、模式变量:是目标变量的拓展,作用域只在符合模式的目标及连带的规则中

26、条件判断语句:只能用于控制make实际执行的语句,但是,不能控制规则中命令的执行过程,常用形式:ifxxx (arg1,arg2):括号中不能有空格

27、条件判断关键字:ifeq:判断参数是否相等;ifneq:判断参数是否不相等;ifdef:判断变量是否有值;ifndef:判断变量是否没有值

28、ifneq ($(var),) :逗号后面表示空;递归赋值方式的时候空也认为有值

29、条件判断语句前不能有Tab字符(‘\t’);条件判断只在预处理阶段有效,执行阶段无效

30、makefile提供了一系列函数,也支持自定义函数,通过define  。。。endef 关键字实现自定义函数;$(call func) :调用

31、自定义函数:是一个多行变量,无法直接调用;是一种过程调用,没有任何的返回值;用于定义命令集合,并应用于规则中

32、预定义函数:在调用的地方被替换为处理结果,可以在调用的地方指定参数:var := $(func_name arge1,arge2,...)

33、预定义函数和自定义函数调用方法不同,本质:makefile 中不支持正真意义上的自定义函数(本质是多行变量),预定义的call函数在调用时将参数传递给多行变量,自定义函数是call函数的实参,并在call中被执行(参数的替换)

34、技巧:自动获取当前目录下的源文件列表(函数调用):SRCS := $(wildcard *.c);根据源文件列表生成目标文件列表(变量的值替换):OBJS := $(SRCS:.C=.O);对每一个目标文件列表加上路径前缀(函数调用):OBJS:= $(addprefix path/,$(OBJS))

35、目录可以成为目标的依赖

36、linux 中的sed命令:正则表达式的支持,前面加 - 号会屏蔽错误和警告报告,直接向下执行

37、gcc -M test.c :获取目标的完整依赖关系;gcc -MM test.c :获取目标的部分依赖关系。可以拆分依赖

38、include 关键字:将其他文件的内容原封不动的搬入当前文件

39、makefile 执行机制:规则中的每个命令默认是在一个新的进程中执行(shell),可以通过接续符(;)将多个命令组合成一个命令,组合的命令依次在同一个进程中被执行,set -e 指定发生错误后立即退出执行

40、makefile 隐式规则(出现同名目标):依赖:所有的依赖将合并在一起,生成目标的最终依赖;命令:当多处出现同一目标的命令时,make发出警告,所有之前定义的命令被最后的命令取代

41、makefile 隐式规则副作用:编译行为难以控制,编译效率低下:make 从隐式规则和自定义规则中选择最终使用的规则;查看隐式规则:查看所有 make -p;查看具体规则:make -p | grep "xxx"

42、makefile 隐式规则禁用:局部禁用:自定义规则;全局禁用:make -r

43、双后缀规则:双后缀规则:.cpp.o -> %.o:%.cpp

       单后缀规则:.c -> %:%.c

44、make 对VPATH值的处理方式:当前文件夹找不到需要的文件时,VPATH会被使用,make 会在VPATH指定的文件夹中依次搜索文件,当多个文件夹存在同名文件时,选择第一次搜索到的文件。VPATH只能决定make的搜索路径,无法决定命令的搜索路径

45、vpath(小写):为不同类型的文件指定不同的搜索路径,vpath %.h inc。可动态设置/取消搜索路径;自上而下搜索

46、GPATH预定义变量的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值