Makefile(06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)

编写 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

函数使用格式如下:

$(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、添加前缀名函数 addperfix

函数使用格式如下:

$(addperfix <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 命令,在使用通配符的时通配符自动展开,我们这里只是相要说明一下这个函数在使用时,如果通过引用变量出现在规则中要被使用)。
 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: makefile中的wildcard函数是一个用于查找文件的函数。它可以在makefile中使用通配符来查找指定目录下的文件,并将结果返回给makefile。例如,$(wildcard *.c)将查找当前目录下所有以.c结尾的文件,并将它们返回给makefile。这个函数makefile中非常有用,可以帮助我们自动化构建过程中的文件查找和处理。 ### 回答2: makefilewildcard函数是常用的函数之一,它能够返回指定文件夹下的所有符合指定规则的文件名,并返回这些文件名列表。wildcard函数通常用于指定需要编译的文件名,也可以用于反复使用的文件名列表中。 wildcard函数的一般语法为: $(wildcard PATTERN),其中PATTERN表示要匹配的文件名规则。 wildcard函数返回的是一个由匹配的文件名组成的列表,可以使用变量来存储这个列表。 例如,假设要编译source文件夹下所有以.c为后缀的文件,可以在makefile中使用以下代码: ``` SRC_FILES=$(wildcard ./source/*.c) gcc -o program $(SRC_FILES) ``` 这里,wildcard函数返回了source文件夹下所有以.c结尾的文件名列表,保存在变量SRC_FILES中,然后使用gcc命令编译所有这些文件,并生成一个名为program的可执行文件。 可以使用通配符'*'和'?'在PATTERN中指定通配符规则,'*'表示任意多个字符,'?'表示一个任意字符。例如,'*.c'匹配所有以.c结尾的文件名,'?abc.c'匹配所有第二个字符为a,后面紧接着abc.c的文件名。 可以使用多个wildcard函数来匹配多个不同的文件规则和文件夹。示例代码如下: ``` C_FILES=$(wildcard ./source/*.c) ASM_FILES=$(wildcard ./assembly/*.s) OBJ_FILES=$(wildcard ./obj/*.o) gcc -o program $(C_FILES) $(ASM_FILES) $(OBJ_FILES) ``` 在这个例子中,C_FILES变量匹配source文件夹下所有以.c结尾的文件名,ASM_FILES变量匹配assembly文件夹下所有以.s结尾的文件名,OBJ_FILES变量匹配obj文件夹下所有以.o结尾的文件名。这些变量被用来编译生成一个名为program的可执行文件。 在组织大型项目或使用复杂的目录结构时,使用makefilewildcard函数可以大大简化makefile文件的编写,提高工作效率。 ### 回答3: makefile 是一种用来自动化编译软件的工具,其中 wildcard 函数是其实现过程中的一个重要函数。在 makefile 中,通配符是一种惯用手法,它可以帮助我们在编译程序时,方便快捷地匹配文件和目录,避免了手动输入冗长的文件名的麻烦。而 wildcard 函数则是用来扩展通配符的,使其能够匹配更多的文件和目录。 wildcard 函数的语法格式为 $(wildcard pattern),其中 pattern 表示通配符表达式,函数会将其匹配的所有文件和目录以空格分隔的字符串列表形式返回给 makefile。例如,$(wildcard *.c) 将会匹配所有以 .c 后缀结尾的文件,并将其返回成字符串列表形式。 Wildcard 函数的实用性非常高,在 makefile 的使用中应用广泛。通过 wildcard 函数,我们可以对文件进行过滤和筛选,便于其它函数的处理。例如,在 makefile 编译程序时,我们经常需要对指定目录下的特定文件进行编译操作,而此时使用 wildcard 函数就可以很方便地获取指定目录下所有符合指定格式的文件名,然后传递给 make 工具来编译。 此外,wildcard 函数还可以与其它函数组合使用,比如与 foreach 函数一起使用,可以将通配符扩展得更细致、更智能化。比如,我们可以使用 foreach 函数遍历所有符合条件的文件,然后对它们依次执行编译操作,这样就能够实现更加灵活、强大的操作了。 总的来说,wildcard 函数makefile 的使用中非常实用,它能够帮助我们更快捷地获取指定的文件和目录列表,方便程序的编译和处理。因此,在学习和使用 makefile 时,我们一定要重视 wildcard 函数的掌握和使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值