场景:
刚刚接手一个小模块的维护,也是处于开发之初, 一开始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
解决方案:
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