Makefile 从不同的源文件夹在一个文件夹中创建对象文件

Makefile 从不同的源文件夹在一个文件夹中创建对象文件,makefile,gnu-make,keil,Makefile,Gnu Make,Keil,我正在创建一个基于Keil的项目的Makefile。我现在有一个工作的Makefile,但是我已经为所有源文件手动编写了规则,如下所示: out/abc.o: ../../../src/modules/abc.c ARMCC -o $@ $(FLAGS) $^ out/def.o: ../../../src/utilities/def.c ARMCC -o $@ $(FLAGS) $^ out/xyz.o: src/xyz.c ARMCC -o $@

我正在创建一个基于Keil的项目的Makefile。我现在有一个工作的Makefile,但是我已经为所有源文件手动编写了规则,如下所示:

out/abc.o: ../../../src/modules/abc.c
       ARMCC -o $@ $(FLAGS) $^ 
out/def.o: ../../../src/utilities/def.c
       ARMCC -o $@ $(FLAGS) $^ 
out/xyz.o: src/xyz.c
       ARMCC -o $@ $(FLAGS) $^ 
这已经有点长了。目标文件需要位于一个目录(
/out
)中,但源文件位于不同的级别和不同的文件夹中,如
实用程序
模块
等。是否有办法缩短我的Makefile,以便它扫描这些不同级别的源文件并创建目标文件

编辑: 答案的后续问题。我的链接器规则是这样的,还添加了VPATH。我向VPATH添加了一个目录,其他目录仍显式编译

OBJECT_FILES=out/abc.o out/def.o out/xyz.o

out/binary.axf: $(OBJECT_FILES)
               ARMLINK $(MANY_FLAGS) $^ -o $@
VPATH=../a/b/c/module
out/%.o : %.c
        $(CC) $(C_FLAGS) $(INCLUDE_PATH) -o $@ --depend out/%.d $<

您可以为此使用VPATH。它可以在目录列表中搜索源文件。假设您可以列出目录列表:

VPATH = ../../../src src

CC = ARMCC

out/%.o : %.c
        $(CC) -o $@ $(CFLAGS) -c $<
VPATH=../../../src src
CC=ARMCC
out/%.o:%.c
$(CC)-o$@$(CFLAGS)-c$<

啊,这绝对有帮助!如果你不介意的话,再问一个问题。所以我尝试了这个方法,但是因为我对用于创建二进制文件的每个.o都有显式规则,所以现在二进制创建规则(取决于每个对象文件)出现了问题,因为创建对象文件的显式规则消失了。我不确定这是否是因为这个新加入的或者其他我做得不正确的原因。@rookie,如果没有看到规则,这将很难确定。我怀疑这是因为对象文件在
out/
中,但它正在当前目录中查找它们。但那只是猜测而已,我同意。当然,你的规则是错误的,但是因为你既没有显示规则,也没有显示准确的错误消息,所以我们没有什么可说的。我在问题中添加了一些内容来澄清问题,我希望这会有所帮助。这是你应该发布的另一个问题。但是,这意味着它在任何VPATH路径中都找不到“abc.c”。您可以运行
make-d
,查看有关它所查找内容的更多信息。
VPATH = ../../../src src

CC = ARMCC

out/%.o : %.c
        $(CC) -o $@ $(CFLAGS) -c $<