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

如何编写生成两个可执行文件的Makefile?C项目构建遇阻

解决Makefile生成两个可执行文件的问题

我来帮你搞定这个Makefile的问题!你想要同时生成主程序和测试程序对吧?先给你一个能正常工作的版本,然后我再拆解一下关键要点:

CC = gcc
CFLAGS = -Wall -Wextra -ansi
SRCDIR = src
OBJDIR = obj
BINDIR = bin
TESTDIR = tests

# 主程序的目标文件
MAIN_OBJS = $(OBJDIR)/main.o $(OBJDIR)/plateau.o $(OBJDIR)/tuile.o
# 测试程序的目标文件(依赖业务模块+测试代码)
TEST_OBJS = $(OBJDIR)/tests.o $(OBJDIR)/plateau.o $(OBJDIR)/tuile.o

# 默认目标:生成两个可执行文件
all: $(BINDIR)/honshu $(BINDIR)/honshu-tests

# 主程序编译规则
$(BINDIR)/honshu: $(MAIN_OBJS)
	$(CC) $(CFLAGS) $^ -o $@

# 测试程序编译规则
$(BINDIR)/honshu-tests: $(TEST_OBJS)
	$(CC) $(CFLAGS) $^ -o $@

# 自动编译src目录下的.c文件到obj目录
$(OBJDIR)/%.o: $(SRCDIR)/%.c
	@mkdir -p $(OBJDIR)
	@mkdir -p $(BINDIR)
	$(CC) $(CFLAGS) -c $< -o $@

# 自动编译tests目录下的.c文件到obj目录
$(OBJDIR)/%.o: $(TESTDIR)/%.c
	@mkdir -p $(OBJDIR)
	@mkdir -p $(BINDIR)
	$(CC) $(CFLAGS) -c $< -o $@

# 清理生成的文件
clean:
	rm -rf $(OBJDIR) $(BINDIR)

关键要点解释:

  • 拆分目标依赖:把主程序和测试程序的目标文件分开定义,确保测试程序能复用业务模块的plateau.o和tuile.o,不用重复编译
  • 规范路径管理:所有生成的可执行文件都放到bin/,目标文件放到obj/,用mkdir -p确保目录存在(避免手动创建)
  • 模式规则简化:用$(OBJDIR)/%.o: $(SRCDIR)/%.c这种模式规则,自动匹配并编译所有src下的c文件,不用逐个写编译规则
  • 默认目标明确:all同时依赖两个可执行文件,执行make或者make all就会一次性生成两个程序

你之前的Makefile失效,大概率是因为没有单独为测试程序定义依赖和编译规则,或者没有正确处理测试代码和业务模块的关联。用上面这个版本试试,应该就能正常生成两个可执行文件了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:28:18