Makefile的一些技巧

    xiaoxiao2022-07-04  145

    最近被一个朋友问到Makefile的一点细节问题,一时忘记了没有答出来,挺尴尬......遂对Makefile的一些技巧细节做以总结

    一个多个文件项目的Makefile文件:

    # 定义编译器、链接器 CC = gcc LD = gcc # 通配符函数表示目录下所有.c文件,相当于:SRCS = main.c a.c b.c SRCS = $(wildcard *.c) # 通配符函数把列表中的.c全部替换为.o,相当于:OBJS = main.o a.o b.o OBJS = $(patsubst %c, %o, $(SRCS)) # 可执行文件的名字 TARGET = Test # .PHONE伪目标 .PHONY:all clean # 要生成的目标文件 all: $(TARGET) # 依赖关系:冒号后面为依赖的文件,相当于Test: main.o a.o b.o # 规则:$@表示目标文件,$^表示所有依赖文件,$<表示第一个依赖文件 $(TARGET): $(OBJS) $(LD) -o $@ $^ # 上一句目标文件依赖一大堆.o文件,这句表示所有.o都由相应名字的.c文件自动生成 %o:%c $(CC) -c $^ # make clean删除所有.o和目标文件 clean: rm -f $(OBJS) $(TARGET)

    其中主要介绍一下下面3个通配符函数

    wildcard:扩展通配符

    $(wildcard PATTERN...) 

    Makefile中通常通配符会被自动展开,但是在变量的定义和函数引用时通配符就会失效,所以要使用扩展通配符函数将存在的、匹配此模式的文件以空格间隔展开

    notdir:去除路径

    $(notdir $(src))

    将src文件列表中的信息去除掉目录信息显示

    patsubst:替换通配符

    $(patsubst %.c,%.o,$(dir))

    将dir目录中的所有.c文件替换成.o文件

    下面为大家举一个例子:

    src=$(wildcard *.c ./function/*.c) dir=$(notdir $(src)) obj=$(patsubst %.c,%.o,$(dir) ) all: @echo $(src) @echo $(dir) @echo $(obj)

    运行结果如图:

    第一行使用wildcard展开通配符函数将 ./function/ 目录中的所有.c文件以文件列表形式展开

    第二行将src中的文件列表信息去除目录显示

    第三行将dir中所有文件的 .c 后缀替换成 .o 

    最新回复(0)