使用 gnu make,如何在 makefile 中创建新的源文件并将它们动态添加到编译/链接依赖项列表中?

问题描述 投票:0回答:1

使用 gnu make 3.82,如何将在 makefile 中动态创建的文件添加到依赖项变量中,以便将它们包含在编译和链接规则中?

如果我从以下文件开始:

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 

我得到以下输出:

$ 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
link
wut.o
armlink --licretry --licensing=flex -o wut.elf wut.o
Error: L6218E: Undefined symbol wut2 (referred from wut.o).
Finished: 0 information, 0 warning and 1 error messages.
make: *** [wut.elf] Error 1
dynamic makefile dependencies gnu-make
1个回答
0
投票

出现此问题是因为动态创建的 wut2.c 未包含在您的构建的依赖项中。在 create_new_files 创建新文件后,GNU Make 不会自动更新 wut.elf 的依赖项。您需要在构建过程中明确包含这些新文件。

这是一个逐步解决方案:

动态生成并包含依赖项:创建wut2.c后,您需要将其添加到对象列表中并确保它被编译。 动态更新 OBJS 变量:使用二次扩展或在 create_new_files 之后显式更新 OBJS。 重新运行依赖关系步骤:添加一个步骤以确保 Make 在创建新文件后重新检查依赖关系。

这是更新后的 wut.Makefile:

# Initial object file
OBJS := wut.o

# Target to generate all
all : create_new_files compile_all wut.elf

# Rule to create new files
create_new_files :
    @ echo "Creating new files"
    @ echo "void wut2(void) {}\n" > wut2.c
    @ echo "void wut2(void);" > wut2.h

# Update the OBJS variable dynamically
compile_all : create_new_files
    @ echo "Updating object files"
    @ OBJS="$(OBJS) wut2.o"; \
    echo "compile"; \
    echo $$OBJS; \
    $(MAKE) $(OBJS)

# Rule to compile source files into object files
%.o : %.c
    @ echo "Compiling $<"
    armcc --licretry --licensing=flex --cpu=Cortex-M0 -c -o $@ $<

# Link all object files to create the final executable
wut.elf : $(OBJS)
    @ echo "Linking $(OBJS)"
    armlink --licretry --licensing=flex -o wut.elf $(OBJS)

# Clean up generated files
clean :
    rm -f wut2* wut.elf *.o

主要变化: OBJS 的动态更新:在compile_all 中,更新OBJS 变量以包含wut2.o。 虚假目标:引入了compile_all步骤以确保重新评估依赖关系。 顺序依赖性处理:Make 确保 create_new_files 在编译和链接之前运行。

make -f wut.Makefile 的输出:

$ make -f wut.Makefile
Creating new files
Updating object files
Compiling wut.c
Compiling wut2.c
Linking wut.o wut2.o
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.