让我们来嚼makefile---wildcard和patsubst

本文从一个简单的Makefile开始,逐步展示了随着项目复杂度增加如何优化Makefile。通过使用$(wildcard)和$(patsubst)等技巧简化了规则定义,并实现了更高效的源文件和目标文件管理。

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

场景:

刚刚接手一个小模块的维护,也是处于开发之初, 一开始makefile, 第一个版本长这样;


$(CC)=gcc
filter:main.o
    $(CC) -g -o filter main.o
main.o:
    $(CC) -g -Wall -c main.c
clean:
	rm -r filter *.o

文件个数很少,简直感觉压根不用makefile, 很清晰。感觉良好。

马上随着项目增加,文件数增加,忙着编写程序和调试,makefile将就着吧,第二个版本长这样;

CC=gcc
filter:main.o  trace.o  parse_option.o time_func.o dump_normal.o machine_info.o preprocess_packet.o capture_packet.o  filter_record.o  dump_json.o process_flowtable.o hash.o http_filter.o
	$(CC) -g -Wall -o $@ $^ -lpcap -lpthread -ljansson
main.o:main.c main.h macro_data.h trace.h
	$(CC) -g -Wall  -c  main.c -lpcap -lpthread -ljansson -D DEBUG
trace.o:trace.c 
	$(CC) -g -Wall  -c trace.c -D DEBUG
process_flowtable.o:process_flowtable.c main.h hash.h
	$(CC) -g -Wall  -c process_flowtable.c -lpthread -D DEBUG
hash.o:hash.c hash.h main.h
	$(CC) -g -Wall  -c hash.c -D DEBUG
http_filter.o:http_filter.c main.h
	$(CC) -g -Wall  -c http_filter.c -D DEBUG
parse_option.o: parse_option.c 
	$(CC) -g -Wall  -c parse_option.c -D DEBUG
dump_normal.o: dump_normal.c
	$(CC) -g -Wall  -c dump_normal.c -D DEBUG
dump_json.o: dump_json.c
	$(CC) -g -Wall  -c dump_json.c -ljansson -D DEBUG
capture_packet.o: capture_packet.c
	$(CC) -g -Wall  -c capture_packet.c -D DEBUG
filter_record.o:filter_record.c
	$(CC) -g -Wall  -c filter_record.c -D DEBUG
preprocess_packet.o:preprocess_packet.c
	$(CC) -g -Wall  -c preprocess_packet.c -D DEBUG
time_func.o:time_func.c
	$(CC) -g -Wall -c time_func.c -D DEBUG
machine_info.o:machine_info.c
	$(CC) -g -Wall -c machine_info.c -D DEBUG
clean:
	rm -rf filter *.o
是不是有点长残了, 不忍直视了。 刚想崩溃,PL过来说,要加个编译宏, 分别编译成发布版本和调试版本,彻底玩完。


解决方案:

CC=gcc
SRCS=$(wildcard *c)
OBJS=$(patsubst %.c, %.o, $(SRCS))
filter:${OBJS}
	$(CC) -g -Wall -o $@ $^ -lpcap -lpthread -ljansson
%.o:%.c
	$(CC) -g -Wall -c $^
clean:
	rm -rf filter *.o


$(wildcard *.c): 返回当前目录下所有的.c源文件列表;注意:这只是当前目录,项目再大一些,目录分级,就要抱find命令的大腿了;

$(patsubst %.c, %.o, $(SRCS))把所有$(SRCS)中所有符合模式%.c的文件后缀修改成%.o。 替换前:foo.c  结果: foo.o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值