简短的makefile

如何写好一个makefile,让其简短又可读性强?这里博主推荐一种写法(顺便方便自己以后开发使用做一下记录)。GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个.o文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。

只要make看到一个.o文件,它就会自动的把.c文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CC = g++
CPPFLAGS=-Wall -std=c++11 -ggdb
#source_file := $(wildcard *.c)
objects := $(patsubst %.c,%.o,$(wildcard *.c))
#executables := $(patsubst %.c,%,$(wildcard *.c))

target := client
#%.o : %.c
# $(CC) $(LDFLAGS) -c $< -o $@

all: $(target)
$(target): $(objects)
$(CC) $(LDFLAGS) $^ -o $@

clean:
rm -f *.o
rm -rf $(target)

$@ 扩展成当前规则的目的文件名,$<扩展成依靠列表中的第 一个依靠文件,而 $^ 扩展成整个依靠的列表(除掉了里面所有重复的文件名)。
这种方法,也就是make的“隐晦规则”。