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

如何在GNU Make 3.82中动态生成源文件并加入编译链接依赖

在GNU Make 3.82中纳入动态生成文件到编译链接流程的方法

问题场景

现有Makefile会动态生成wut2.c和wut2.h,但生成的文件未被纳入编译链接流程,导致链接时出现Undefined symbol wut2错误。初始代码如下:

wut.c

#include "wut2.h"

int main()
{
    wut2();
}

原始wut.Makefile

OBJS := wut.o

all : create_new_files wut.elf

create_new_files :
    @ echo "create_new_files"
    echo "void wut2(void) {}\n" > wut2.c
    echo "void wut2(void);" > wut2.h

%.o : %.c
    @ echo "compile"
    @ echo $@
    @ echo $<
    armcc --licretry --licensing=flex --cpu=Cortex-M0 -c -o $@ $<

wut.elf : $(OBJS)
    @ echo "link"
    @ echo $(OBJS)
    armlink --licretry --licensing=flex -o wut.elf $(OBJS) 

clean :
    rm wut2*
    rm *.o 

解决方法

修改Makefile,让动态生成的文件被正确追踪并纳入编译链接流程,修改后的Makefile如下:

修改后的wut.Makefile

OBJS := wut.o wut2.o

all : wut.elf

# 将生成目标改为实际文件,让Make追踪文件状态
wut2.c wut2.h :
	@echo "create_new_files"
	echo "void wut2(void) {}\n" > wut2.c
	echo "void wut2(void);" > wut2.h

# 显式声明wut.o依赖wut2.h,确保头文件生成后重新编译源文件
wut.o : wut.c wut2.h

%.o : %.c
	@echo "compile"
	@echo $@
	@echo $<
	armcc --licretry --licensing=flex --cpu=Cortex-M0 -c -o $@ $<

wut.elf : $(OBJS)
	@echo "link"
	@echo $(OBJS)
	armlink --licretry --licensing=flex -o wut.elf $(OBJS) 

clean :
	rm wut2*
	rm *.o 

关键修改说明

  • 明确纳入动态生成文件的目标文件:直接将wut2.o加入OBJS变量,Make会通过%.o:%.c规则自动推导其依赖wut2.c,触发文件生成与编译流程。
  • 替换伪目标为实际生成文件:把原伪目标create_new_files替换为wut2.c wut2.h,让Make能追踪这些文件的存在状态,避免不必要的重复生成。
  • 补充头文件依赖:添加wut.o : wut.c wut2.h规则,确保wut2.h生成后,wut.o会被重新编译,保证代码引用的正确性。

执行结果

修改后执行make -f wut.Makefile,输出如下,链接错误被解决:

$ make -f wut.Makefile
create_new_files
echo "void wut2(void) {}\n" > wut2.c
echo "void wut2(void);" > wut2.h
compile
wut.o
wut.c
armcc --licretry --licensing=flex --cpu=Cortex-M0 -c -o wut.o wut.c
compile
wut2.o
wut2.c
armcc --licretry --licensing=flex --cpu=Cortex-M0 -c -o wut2.o wut2.c
link
wut.o wut2.o
armlink --licretry --licensing=flex -o wut.elf wut.o wut2.o

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:56:03