makefile之patsubst,wildcard和notdir

文章目录

  • 1 patsubst: 替换通配符
  • 2 wildcard: 扩展通配符
  • 3 notdir: 去除路径
  • 4 综合应用
  • 5 扩展
  • 参考原地址

因为项目中用到了patsubst,所以记录一下。

1 patsubst: 替换通配符

格式:$(patsubst <pattern>,<replacement>,<text> ) 
  • 名称:模式字符串替换函数——patsubst。
  • 功能:查找text中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式pattern,如果匹配的话,则以替换。
    这里,pattern可以包括通配符“%”,表示任意长度的字串。如果replacement中也包含“%”,那么,replacement中的这个“%”将是pattern中的那个“%”所代表的字串。
    (可以用“\”来转义,以“%”来表示真实含义的“%”字符)
  • 返回:函数返回被替换过后的字符串。
  • 示例
$(patsubst %.c,%.o, 1.c 2.c)

把字串“1.c,2.c”符合模式[%.c]的单词替换成[%.o],返回结果是“1.o 2.o”

2 wildcard: 扩展通配符

wildcard得到指定目录下所有的C语言源程序文件名

SRC = $(wildcard *.c)

编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则:

SRC = $(wildcard *.c) $(wildcard inc/*.c)

3 notdir: 去除路径

notdir把展开的文件去除掉路径信息

4 综合应用

  • 首先创建如下的目录结构
    在这里插入图片描述
src = $(wildcard *.c ./sub/*.c)dir = $(notdir $(src))obj = $(patsubst %.c,%.o,$(dir) )all:@echo $(src)@echo $(dir)@echo $(obj)@echo "end"

在这里插入图片描述
wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。
notdir把展开的文件去除掉路径信息
patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o
第三句相当于obj=$(dir:%.c=%.o)

5 扩展

Makefile有三个非常有用的变量。分别是 @ , @, @^,$<代表的意义分别是:

$@---------------------------目标文件
$^----------------------------所有的依赖文件
$<----------------------------第一个依赖文件

  • 下面给出傻瓜的makefile
main:main.o 1.o 2.ogcc -o main main.o 1.o 2.omain.o:main.c 1.h 2.hgcc -c main.c1.o:1.c 1.hgcc -c 1.c2.o:2.c 2.hgcc -c 2.c
  • 简化后变成了
main:main.o 1.o 2.ogcc -o $@ $^main.o:main.c 1.h 2.hgcc -c $<1.o:1.c 1.hgcc -c $<2.o:2.c 2.hgcc -c $<
  • 在此简化
main:main.o 1.o 2.ogcc -o $@ $^.c.o:gcc -c $<

表示所有的 .o文件都是依赖与相应的.c文件的

参考原地址

https://www.cnblogs.com/baiduboy/p/6849587.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部