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

如何在主项目中自动编译依赖Git子模块的程序?

依赖Git子模块的项目高效编译方案

你当前的项目依赖Git子模块guard,子模块自带Makefile可编译出guard.o,但现在需要手动先进入子模块执行make,再回到主项目编译,效率很低。通过修改主项目的Makefile,就能让它自动处理子模块的编译流程,具体做法如下:

1. 给子模块目标文件添加自动编译规则

在主Makefile中,为guard/guard.o添加规则,让make自动触发子模块的编译命令:

guard/guard.o:
	$(MAKE) -C guard

这里$(MAKE)是make的内置变量,会自动调用当前系统的make工具;-C guard表示切换到guard目录执行该目录下的Makefile。

如果想更严谨,可让guard/guard.o依赖子模块的源文件,这样子模块的guard.c或guard.h改动时,主Makefile会自动重新编译子模块:

guard/guard.o: guard/guard.c guard/guard.h
	$(MAKE) -C guard

不过子模块自身的Makefile已经处理了内部依赖,所以第一条简单规则已能满足需求。

2. 整合clean命令(可选)

如果希望执行make clean时同时清理子模块的编译产物,可修改主Makefile的clean目标:

clean:
	rm -rf temp ./*.o a.out
	$(MAKE) -C guard clean

修改后的完整主Makefile

cc = gcc
objs = temp/main.o temp/list.o guard/guard.o
dirs = temp
CFLAGS = -O1

main: $(objs) 
	$(cc) $(CFLAGS) -o a.out $(objs)

temp/main.o: main.c
	$(cc) -c -g -o temp/main.o main.c

temp/list.o: list.h list.c
	$(cc) -c -g -o temp/list.o list.c

# 自动编译子模块的规则
guard/guard.o:
	$(MAKE) -C guard

.PHONY: clean

clean:
	rm -rf temp ./*.o a.out
	$(MAKE) -C guard clean

$(shell mkdir -p $(dirs))

修改完成后,你只需在主项目目录执行一次make,它会自动检查子模块的guard.o是否存在,不存在或子模块文件有更新时,会先编译子模块,再完成主项目的链接。执行make clean也会同时清理子模块的编译文件,完全无需手动切换目录操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:57:28