一个覆盖80%需求的Makefile模板。
1. 先上模板
# (1)编译器配置
CC=gcc
CFLAGS=-Wall
LDFLAGS=-lpthread
INSTALL=/usr/bin/install -c
# (2)路径配置
prefix=/usr/local
includedir=$(prefix)/include
libdir=$(prefix)/lib
# (3) wildcard *.h == ls *.h
# (c_files:.c=.o) 把.c替换成.o
header_files=$(wildcard *.h)
c_files=$(wildcard *.c)
objects=$(c_files:.c=.o)
all:$(objects)
$(CC) $(LDFLAGS) $^ -o demo
# (4) %.o %.c 模式规则
# $^ == %.c 表示依赖的第一个参数
# $@ == %.o 表示目标
%.o:%.c
$(CC) $(CFLAGS) -c $^ -o $@
# (5) 表示伪目标
.PHONY: install uninstall clean
install:
mkdir -p $(prefix)/makefile_demo
cp demo $(prefix)/makefile_demo
uninstall:
rm -rf $(prefix)/makefile_demo
clean:
rm -f $(objects) demo
2. 上面 Makefile 实现了哪些功能
- 通配单目录源文件 C 程序工程,只需改 target 名字。
- 新增、删减文件无需改Makefile。
3. 理论
3.1 结构规则
目标: [依赖列表]
<Tab 缩进>[命令]
- 结构规则中的依赖列表 命令可选。
3.2 依赖关系
-
Makefile 是一个树,all 是这个树的根节点,all 有依赖,依赖又会是目标,又会有依赖。如同一棵树从树根到树干再到树枝最后到树叶,发散依赖。
-
详细参考,为小项目写 Makefile