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

