黑暗滚球兽的Makefile学习笔记(3)

一、前言

        在这篇文章中,我们首先会把我认为常用的函数逐一列出,附上示例,我认为函数是使像我这样的新手读不懂Makefile的重要原因之一。因为Makefile中函数和我们常用的语言中的,如C/C++等,具有较大的差距,这可能会使我们一时间摸不到头脑,但是只要习惯了,注意了就没什么好怕的了:)

二、函数使用

2.1函数调用方式

        Makefile的函数与常用语言的函数存在着较大差别,它有三个规则:

        1)函数名与参数之间以空格连接

        2)参数之间以逗号连接

        3)通过"$(*)"调用函数,其中*代表函数名与参数

        在刚接触Makefile时,我常常会因为分不清函数嵌套的逻辑,记不住函数的功能而导致无法明确代码语义。

2.2字符串处理函数

2.2.1subst 

使用方式:ans = $(subst $(a),$(b),$(var))

功能:将var中的a转换为b,并将结果赋给ans

2.2.2patsubst 

使用方式:ans = $(patsubst <pattern1>,<pattern2>,$(var))

功能:检索var中符合<pattern1>的字符串,并将其变为<pattern2>,将结果赋给ans

注:上述说明可能会比较抽象,实际这个函数比较想我写的上一篇文章的变量实用用法

obj = a.o b.o c.o

src = $(obj .o=.c)与src = $(patsubst %.o,%.c,$(obj))等价

2.2.3strip

使用方式:ans = $(strip $(var))

功能:去除var前后的空格,并将结果赋给ans

2.2.4findstring

使用方式:ans = $(findstring $(a),$(var))

功能:在var中查找a,若找到则返回a,否则返回空字符串

2.2.5filter

使用方式:ans = $(filter <pattern>,$(var))

功能:在var筛选出符合<pattern>的值,并将符合的赋给ans

2.2.6filter-out

与filter相反

2.2.7sort

使用方式:ans = $(sort $(var))

功能:将var中的单词按照升序排序,并将结果赋给ans

2.2.8word

使用方式:ans = $(word num,$(var))

功能:返回var中的第num个单词,并将其赋给ans

2.2.9words

使用方式:ans = $(words $(var))

功能:返回var中单词的数量,并将其赋给ans

2.3文件名操作函数

        大部分和文件名相关的函数都是成对出现的,因此我们一组一组的总结。我觉得我列出的这些文件名操作函数真的时非常有用的,因为Makefile是为了大型工程的“自动化编译”,文件数量往往较多,批量的文件操作是十分常用的。

2.3.1dir/notdir

使用方式:ans = $(dir(notdir) <names>)

功能:返回文件的路径(名字)

name = ./include/sort.h ./include/types.h ./src/sort.c
name_dir = $(dir $(name))
name_notdir = $(notdir $(name))


all:
	@echo $(name_dir)
	@echo $(name_notdir)

输出如下:

./include/ ./include/ ./src/
sort.h types.h sort.c

2.3.2suffix/basename

使用方式:ans = $(suffix(basename) <name>)

功能:取name中每个字符串的后缀(前缀),并将其赋给ans

name = ./include/sort.h ./include/types.h ./src/sort.c
name_suffix = $(suffix $(name))
name_basename = $(basename $(name))

all:
	@echo $(name_suffix)
	@echo $(name_basename)

输出为:

.h .h .c
./include/sort ./include/types ./src/sort

2.3.3addsuffix/addprefix

使用方式:ans = $(addsuffix(addprefix) <name>,$(var))

功能:把<name>架子啊var中每个字符串的后面(前面),并赋给ans

name1 = ./include/
name2 = .h
prog = test sort
ans = $(addsuffix $(name2),$(addprefix $(name1),$(prog)))

all:
	@echo $(ans)

输出为:

./include/test.h ./include/sort.h

2.3.4join

使用方式:ans = $(join $(var1),$(var2))

功能:将var2的单词依次接在var1中每个单词的后面,并将结果赋给ans

var1 = sort test
var2 = .o .c
all:
    @echo $(join $(var1),$(var2))

输出为:

sort.o test.c

三、结语

        由于篇幅的显示,这篇文章中仅罗列了较为基本的函数,如果我在工作过程中给遇到了其他函数,我会在未来的学习笔记中添加,或者直接修改这篇文章。在大型工程的Makefile中不一定会大量使用一些复杂的函数,相反其中大多数情况是多个简单函数的嵌套,因此我觉得在这部分一定要做到熟练记忆并使用各种简单函数!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值