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

如何编写Makefile实现项目各模块的批量自动化测试

实现模块化测试的Makefile方案

首先先明确你的项目结构:

/project
 |
 |____/bin
 |
 |____/obj
 |
 |____/include
 |     |____aaa.h
 |     |____bbb.h
 |     |____ccc.h
 |
 |____/src
 |     |____aaa.c
 |     |____bbb.c
 |     |____ccc.c
 |
 |____/test
 |     |____aaa_test.c
 |     |____bbb_test.c
 |     |____ccc_test.c
 |
 |____Makefile

下面是满足你需求的Makefile,它会自动遍历test目录的测试文件,对应编译src中同名(去掉_test后缀)的模块,并生成独立的可执行文件:

# 基础配置:指定编译器、编译选项和各个目录
CC := gcc
CFLAGS := -Wall -Wextra -Iinclude
OBJ_DIR := obj
BIN_DIR := bin
SRC_DIR := src
TEST_DIR := test

# 自动获取所有测试文件,并转换为对应的可执行文件名
TEST_SRCS := $(wildcard $(TEST_DIR)/*.c)
TEST_TARGETS := $(patsubst $(TEST_DIR)/%_test.c,$(BIN_DIR)/%,$(TEST_SRCS))

# 默认目标:编译所有测试可执行文件
all: $(TEST_TARGETS)

# 生成单个测试可执行文件的规则:匹配对应测试文件和模块目标文件,链接生成可执行文件
$(BIN_DIR)/%: $(TEST_DIR)/%_test.c $(OBJ_DIR)/%.o
	@mkdir -p $(BIN_DIR)  # 确保bin目录存在,@避免打印命令
	$(CC) $(CFLAGS) $^ -o $@

# 编译src目录下的模块为目标文件:把src里的.c文件编译到obj目录
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
	@mkdir -p $(OBJ_DIR)  # 确保obj目录存在
	$(CC) $(CFLAGS) -c $< -o $@

# 清理所有生成的文件
clean:
	rm -rf $(OBJ_DIR) $(BIN_DIR)

# 声明伪目标,避免和同名文件冲突
.PHONY: all clean

关键逻辑拆解

1. 自动遍历与目标生成

  • 用**$(wildcard $(TEST_DIR)/*.c)**自动抓取test目录下所有.c测试文件,不用手动逐个添加
  • 用**$(patsubst)**函数做字符串替换:把test/aaa_test.c这种格式转换成bin/aaa,自动生成所有要编译的可执行文件目标

2. 模块化编译规则

  • 每个测试可执行文件(比如bin/aaa)依赖对应的测试源文件(test/aaa_test.c)和模块目标文件(obj/aaa.o),确保只编译需要的模块
  • 模块目标文件会先被编译到obj目录,避免源文件目录混乱,也方便后续增量编译(只修改了某个模块时,不用重新编译所有文件)

3. 实用辅助功能

  • 自动创建bin和obj目录,不用手动提前创建
  • clean目标一键清除所有生成文件,方便重新编译
  • .PHONY声明确保all和clean不会被同名文件干扰

使用方法

  • 执行make:一次性编译所有测试模块,可执行文件都会放在bin目录下
  • 执行make bin/aaa:单独编译aaa模块的测试,节省时间
  • 执行make clean:清理所有编译生成的目标文件和可执行文件

内容的提问来源于stack exchange,提问作者giusepped

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:38:46