makefile中的两个函数(wildcard和patsubst)

本文介绍了Makefile中的wildcard和patsubst函数,前者用于查找指定目录下指定类型文件,后者用于更换文件后缀格式。还讲解了不带依赖条件的规则,以及伪目标声明的作用。最后给出了结合规则、变量和函数的Makefile书写最终版示例。

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

(1) wildcard函数

作用是查找指定目录下指定类型的文件,并最终返回一个环境变量,需要用$取值赋值给另一个环境变量!该函数只有一个参数,如取出当前目录下的所有.c文件,并赋值给allc普通变量:  allc=$(wildcard ./*.c)。

(2) patsubst函数

作用是更换文件的后缀格式,共有三个参数。如将allc的所有.c的文件更换为.o的文件: allo=$(patsubst %.c,%.o,$(allc))。 

注意以上两个函数的返回值都为变量值,都必须用$取值。makefile中的所有函数都必须要有返回值。

allo1=$(patsubst %.c,./bin/%.o,$(allc))  将替换后生成的.o文件都存放在./bin/中,指出路径。

(3)不带依赖条件的规则

对于没有依赖条件,只有目标和命令的规则,说明为了实现该目标,不需要任何依赖条件,直接执行命令即可。makefile直接执行命令。下面举例说明:  再次强调一点,每一行的命令前必须有一个tab缩进,这是makefile识别命令的判断符号。

clean:

        -mkdir /aa   //-表示,该条命令执行失败了,也会继续向下执行下一条命令

        rm -f $(allo) $(target)

 

hello:          //举例说明,这一项在以后中不要

        echo "hello, makefile"

[root@localhost src]# make clean   //只是执行clea后面的命令即可

[root@localhost src]# make hello   //只是执行hello后面的命令即可

如果在makefile文件目录中有一个以clean或hello名字为名的文件(即相同了),则make clean和make hello不会执行命令,需要进行伪目标声明,即:

.PHONY:clean        //伪目标的声明

clean:

        -mkdir /aa   //-表示,该条命令执行失败了,也会继续向下执行下一条命令

        rm -f $(allo) $(target)

 

.PHONY:hello        //伪目标的声明

hello:          //举例说明,这一项在以后中不要

        echo "hello, makefile"

最后,如果makefile文件不是以makefile或Makefile为名字,需要加上-f参数:make -f filename

下面给出之前例子makefile书写的最终版,即把一个规则,两个变量和三个函数结合:

[root@localhost src]# ls
a  add.c  div.c  main.c  makefile  mul.c  sub.c
[root@localhost src]# vim zsxmakefile

allc=$(wildcard ./*.c)    //获取所有的.c文件
obj=$(patsubst %.c,%.o,$(allc))   //更换为.o文件,取得目标文件
target=zsx

$(target):$(obj)
        $(CC) -ggdb3 $^ -o $@

main.o:main.c
        $(CC) -pedantic -Wall -pipe -c $^ -o $@ -I ../include

%.o:%.c
        $(CC) -pedantic -Wall -pipe -c $< -o $@
        
.PHONY:clean1  //伪目标的声明

clean1:
        -mkdir b    //-代表该条命令执行失败了,也会继续向下执行下一条命令
        rm -f $(obj) $(target)

.PHONY:hello     //伪目标的声明

hello:
        echo "hello, makefile"


[root@localhost src]# rm -f makefile 
[root@localhost src]# ls
a  add.c  div.c  main.c  mul.c  sub.c  zsxmakefile
[root@localhost src]# make -f zsxmakefile   //此时需要加-f参数
cc -pedantic -Wall -pipe -c mul.c -o mul.o
cc -pedantic -Wall -pipe -c main.c -o main.o -I ../include
cc -pedantic -Wall -pipe -c add.c -o add.o
cc -pedantic -Wall -pipe -c div.c -o div.o
cc -pedantic -Wall -pipe -c sub.c -o sub.o
cc -ggdb3 mul.o main.o add.o div.o sub.o -o zsx
[root@localhost src]# ls
a  add.c  add.o  div.c  div.o  main.c  main.o  mul.c  mul.o  sub.c  sub.o  zsx  zsxmakefile
[root@localhost src]# make -f zsxmakefile clean1    //注意使用方法  如果文件名字是makefile或Makefile,则直接为make clean1
mkdir b
rm -f ./mul.o ./main.o ./add.o ./div.o ./sub.o zsx
[root@localhost src]# ls
a  add.c  b  div.c  main.c  mul.c  sub.c  zsxmakefile
[root@localhost src]# make -f zsxmakefile hello //注意使用方法
echo "hello, makefile"
hello, makefile

 

//注意区分makemake cleanmake hello的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值