You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:15:06