如何在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
相关产品推荐
相关产品推荐

