如何编写生成两个可执行文件的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
相关产品推荐
相关产品推荐

