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

如何在makefile_2中调用makefile_1并利用其.o文件生成.exe

嘿,作为Makefile新手,这种分模块构建的需求其实挺常见的,我来一步步给你讲清楚怎么实现~

第一步:编写makefile_1(生成output_1目录下的.o文件)

首先我们先搞定负责编译目标文件的makefile_1,它的核心是把源代码编译成.o,并统一放到output_1目录里。你可以根据自己的实际源文件调整下面的代码:

# 定义你的源文件列表(比如你有main.c、utils.c,就这么写;如果在子目录,比如src/main.c,记得加上路径)
SRCS := main.c utils.c
# 自动生成目标文件路径:把每个.c文件对应到output_1目录下的.o
OBJS := $(patsubst %.c, output_1/%.o, $(SRCS))

# 默认执行的目标:生成所有.o文件
all: $(OBJS)

# 确保output_1目录存在(如果不存在就创建)
output_1:
	mkdir -p $@

# 编译规则:将单个.c文件编译成对应的.o,输出到output_1目录
# 这里的| output_1表示:编译.o之前必须先建好output_1目录
output_1/%.o: %.c | output_1
	gcc -c $< -o $@

# 可选:清理生成的目标文件和目录
clean:
	rm -rf output_1

关键说明:

  • patsubst是Makefile的字符串替换函数,帮你自动把.c后缀换成output_1/.o,不用手动写每个.o的路径
  • $<代表当前规则的依赖文件(也就是对应的.c),$@代表当前规则的目标文件(也就是output_1/xxx.o)
  • mkdir -p会自动创建不存在的父目录,避免报错
第二步:编写makefile_2(调用makefile_1并生成folder_2下的.exe)

接下来是makefile_2,它的任务是先调用makefile_1完成编译,再把生成的.o文件链接成可执行文件,放到folder_2目录里:

# 指定makefile_1的路径(如果和makefile_2在同一目录,直接写./makefile_1就行;不在的话写绝对/相对路径)
MAKEFILE_1 := ./makefile_1
# 从makefile_1获取的所有目标文件
OBJS_FROM_1 := output_1/*.o
# 最终要生成的可执行文件路径
TARGET := folder_2/my_program.exe

# 默认目标:生成最终的.exe
all: $(TARGET)

# 先触发makefile_1的编译,确保所有.o文件都生成
$(OBJS_FROM_1):
	$(MAKE) -f $(MAKEFILE_1) all

# 确保folder_2目录存在
folder_2:
	mkdir -p $@

# 链接规则:把所有.o文件链接成可执行文件,输出到folder_2目录
$(TARGET): $(OBJS_FROM_1) | folder_2
	gcc $^ -o $@

# 可选:清理所有生成的文件(包括makefile_1的输出)
clean:
	$(MAKE) -f $(MAKEFILE_1) clean
	rm -rf folder_2

关键说明:

  • $(MAKE)是调用系统的make命令,-f参数指定要执行的Makefile文件(这里就是makefile_1)
  • $^代表当前规则的所有依赖文件(也就是output_1下的所有.o)
  • 当你在makefile_2所在目录运行make时,会先自动执行makefile_1的all目标,生成所有.o,再链接成.exe

额外注意事项:

  • 如果你的代码是C++,把gcc换成g++就行
  • 如果源文件不在当前目录,可以在makefile_1里用VPATH指定源文件搜索路径,比如VPATH := src,这样Makefile会自动去src目录找.c文件
  • 执行清理的话,直接运行make clean,会同时清理两个Makefile生成的文件和目录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:25:30