浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addprefix、join、wildcard)

本文详细介绍了Makefile中用于文件操作的几个关键函数,包括dir、notdir、suffix、basename、addsuffix、addprefix、join和wildcard。这些函数在Makefile中用于处理文件路径、提取文件名的组成部分、添加或移除后缀和前缀,以及获取匹配特定模式的文件列表。通过这些函数,可以更方便地管理和构建项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写 Makefile 的时候,很多情况下需要对文件名进行操作。例如获取文件的路径,去除文件的路径,取出文件前缀或后缀等等。

注意:下面的每个函数的参数字符串都会被当作或是一个系列的文件名来看待。

1. 取目录函数 dir

函数使用格式如下:

$(dir <names>)

函数说明:函数的功能是从文件名序列 names 中取出目录部分,

如果names 中没有 / ,取出的值为 ./ 。返回值为目录部分,指的是最后一个反斜杠之前的部分。如果没有反斜杠将返回 ./。实例:

OBJ=$(dir  a/b/c.cpp, aaa.cpp)
all:
	echo $(OBJ)

执行 make 命令,

wohu@ubuntu:~/cpp/func$ make
echo a/b/ ./
a/b/ ./
wohu@ubuntu:~/cpp/func$ 

2. 取文件函数 notdir

函数使用格式如下:

$(notdir <names>)

函数说明:函数的功能是从文件名序列 names 中取出非目录的部分。非目录的部分是最后一个反斜杠之后的部分。返回值为文件非目录的部分。实例:

OBJ=$(notdir  a/b/c.cpp, aaa.cpp)
all:
	echo $(OBJ)

执行 make 命令,

wohu@ubuntu:~/cpp/func$ make
echo c.cpp, aaa.cpp
c.cpp, aaa.cpp
wohu@ubuntu:~/cpp/func$ 

3. 取后缀名函数 suffix

函数使用格式如下:

$(suffix <names>)

函数说明:函数的功能是从文件名序列中 names 中取出各个文件的后缀名。返回值为文件名序列 names 中的后缀序列,如果文件没有后缀名,则返回空字符串。实例:

OBJ=$(suffix  a/b/c.cpp, demo)
all:
	echo $(OBJ)

执行 make 命令,

wohu@ubuntu:~/cpp/func$ make
echo .cpp,
.cpp,
wohu@ubuntu:~/cpp/func$ 

4. 取前缀函数 basename

函数使用格式如下:

$(basename <names>)

函数说明:函数的功能是从文件名序列 names 中取出各个文件名的前缀部分。返回值为被取出来的文件的前缀名,如果文件没有前缀名则返回空的字符串。实例:

OBJ=$(basename  a/b/c.cpp, demo.o)
all:
	echo $(OBJ)

执行 make 命令

wohu@ubuntu:~/cpp/func$ make
echo a/b/c demo
a/b/c demo
wohu@ubuntu:~/cpp/func$ 

5. 添加后缀名函数

函数使用格式如下:

$(addsuffix <suffix>,<names>)

函数说明:函数的功能是把后缀 suffix 加到 names 中的每个单词后面。返回值为添加上后缀的文件名序列。实例:

OBJ=$(addsuffix .cpp, c.cpp demo)
all:
	echo $(OBJ)

执行 make

wohu@ubuntu:~/cpp/func$ make
echo c.cpp.cpp demo.cpp
c.cpp.cpp demo.cpp
wohu@ubuntu:~/cpp/func$ 

我们可以看到如果文件名存在后缀名,依然会加上。

6. 添加前缀名函数 addprefix

函数使用格式如下:

$(addprefix <prefix>,<names>)

函数说明:函数的功能是把前缀 prefix 加到 names 中的每个单词的前面。返回值为添加上前缀的文件名序列。实例:

OBJ=$(addprefix src/, demo1.cpp demo2.cpp)
all:
	echo $(OBJ)

执行 make 命令,

wohu@ubuntu:~/cpp/func$ make
echo src/demo1.cpp src/demo2.cpp
src/demo1.cpp src/demo2.cpp
wohu@ubuntu:~/cpp/func$ 

可以使用这个函数给我们的文件添加路径。

7. 链接函数 join

函数使用格式如下:

$(join <list1>,<list2>)

函数说明:函数功能是把 list2 中的单词对应的拼接到 list1 的后面。

如果 list1 的单词要比 list2 的多,那么,list1 中多出来的单词将保持原样,如果 list1 中的单词要比 list2 中的单词少,那么 list2 中多出来的单词将保持原样。返回值为拼接好的字符串。实例:

OBJ=$(join aa bb, cc dd ee)
all:
	echo $(OBJ)

执行 make 命令,

wohu@ubuntu:~/cpp/func$ make
echo aacc bbdd ee
aacc bbdd ee
wohu@ubuntu:~/cpp/func$ 

我们可以得到的值是 aacc bbdd ee。很显然 list1 中的文件名比 list2 的少,所以多出来的保持不变。

8. 获取匹配模式文件名函数 wildcard

命令使用格式如下:

$(wildcard PATTERN)

函数说明:函数的功能是列出当前目录下所有符合模式的 PATTERN 格式的文件名。返回值为空格分隔并且存在当前目录下的所有符合模式 PATTERN 的文件名。实例:

OBJ=$(wildcard *.cpp *.h)
all:
	echo $(OBJ)

执行 make 命令,可以得到当前函数下所有的 .cpp.h 结尾的文件。

wohu@ubuntu:~/cpp/func$ ls
demo.cpp  demo.h  Makefile
wohu@ubuntu:~/cpp/func$ make
echo demo.cpp demo.h
demo.cpp demo.h
wohu@ubuntu:~/cpp/func$ 

这个函数通常跟的通配符 * 连用,使用在依赖规则的描述的时候被展开(在这里我们的例子如果没有 wildcard 函数,我们的运行结果也是这样,echo 属于 shell 命令,在使用通配符的时通配符自动展开,我们这里只是相要说明一下这个函数在使用时,如果通过引用变量出现在规则中要被使用)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值