如何编写Makefile编译带共享代码的多个C程序,避免重复声明依赖
Makefile 优化实现方案
最简可维护版本(自动识别所有p*.c源文件)
无需手动逐个添加p1/p2/pn的编译规则,新增源文件时不需要修改Makefile,自动满足增量编译要求:
# 定义共享代码文件 SHARED_SRC = sharedprg.c SHARED_HDR = sharedprg.h # 自动扫描当前目录所有p开头的.c文件,生成对应可执行文件名列表 TARGETS := $(patsubst %.c, %, $(wildcard p*.c)) # 默认编译所有可执行文件 all: $(TARGETS) # 静态模式规则:所有可执行文件的编译逻辑统一声明 $(TARGETS): %: %.c $(SHARED_SRC) $(SHARED_HDR) gcc -o $@ $< $(SHARED_SRC) # 清理规则 clean: rm -f $(TARGETS) *.o
更高编译效率版本(保留中间.o文件)
如果项目文件较多,想要进一步提升增量编译速度,可以拆分编译和链接步骤,避免重复编译共享代码:
SHARED_SRC = sharedprg.c SHARED_HDR = sharedprg.h SHARED_OBJ = $(patsubst %.c, %.o, $(SHARED_SRC)) TARGETS := $(patsubst %.c, %, $(wildcard p*.c)) # 可自定义编译参数,比如警告、优化等级、调试信息等 CFLAGS = -Wall -g all: $(TARGETS) # 所有.c生成.o的通用规则,自动关联共享头文件 %.o: %.c $(SHARED_HDR) $(CC) $(CFLAGS) -c $< # 可执行文件链接规则 $(TARGETS): %: %.o $(SHARED_OBJ) $(CC) $(CFLAGS) -o $@ $^ clean: rm -f $(TARGETS) *.o
核心逻辑说明
- 用
wildcard函数自动扫描所有p*.c源文件,不需要手动罗列p1/p2/p3等目标,新增文件直接编译即可 - 用静态模式规则统一声明所有p系列可执行文件的依赖,共享文件修改会触发所有可执行文件重编译,单个p*.c修改只会重编对应目标,符合增量要求
- 内置自动变量
$@代表当前生成的目标名,$<代表第一个依赖文件,$^代表所有依赖文件,避免重复写相同的编译命令
内容的提问来源于stack exchange,提问作者Adeeb HS
相关产品推荐
相关产品推荐

