需求
在一个文件夹下面有多个.c文件,分别对应一个小程序,而总共只有一个Makefile,只要一个make命令就可以把这些程序全部编译一遍。并且,再往里面增加小程序时,make一下也可以编译这个新增的程序。
思路
1. 我们将文件夹下每个.c文件都视为一个程序,编译出来程序的名字(目标)与.c文件的文件名相同(去掉.c后缀),比如app1.c编译出来的程序为app1。实现这个目的的Makefile片断为:
SOURCE = $(wildcard *.c)
TARGETS = $(patsubst %.c, %, $(SOURCE))
2. 每个.c文件独立编译为一个目标,如果直接手写的话,对应的命令类似为:
gcc app1.c -o app1
gcc app2.c -o app2
gcc test.c -o test
这样的命令可以抽象为一个,即:
$(TARGETS):%:%.c
$(CC) $< $(CFLAGS) -o $@
TARGETS即为app1, app2, test,依赖为%:%c,这是一个模式变量,表示与目标相同的.c文件,即:
app1:app1.c
app2:app2.c
test:test.c
完整的Makefile
SOURCE = $(wildcard *.c)
TARGETS = $(patsubst %.c, %, $(SOURCE))
CC = gcc
CFLAGS = -Wall -g
all:$(TARGETS)
$(TARGETS):%:%.c
$(CC) $< $(CFLAGS) -o $@
.PHONY:clean all
clean:
-rm -rf $(TARGETS)
本文转自公众号【良许Linux】——【玩转Makefile | 一次编译多个目标】