从不同的源文件夹在一个文件夹中创建目标文件

Posted

技术标签:

【中文标题】从不同的源文件夹在一个文件夹中创建目标文件【英文标题】:Create object files in one folder from different source folders 【发布时间】:2018-03-07 05:02:16 【问题描述】:

我正在创建一个基于 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),但源文件位于不同级别和各种文件夹中,如utilitiesmodules 等。有没有办法缩短我的 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 $<

我现在收到一个错误,指出 abc.o 没有规则。 abc.c 存在于VPATH 中module 下指定的目录中

*** No rule to make target `out/abc.o', needed by `out/binary.axf'.  Stop.

【问题讨论】:

您应该发布一个不同的问题。但是,这意味着它在任何 VPATH 路径中都找不到“abc.c”。您可以运行 make -d 并查看有关它要查找的内容的更多信息。 【参考方案1】:

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

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

CC = ARMCC

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

【讨论】:

啊,这绝对有帮助!如果您不介意,请提出后续问题。所以我尝试了这个,但是因为我对每个用于创建二进制文件的 .o 都有明确的规则,所以现在二进制文件创建规则(取决于每个目标文件)现在抱怨,因为创建目标文件的明确规则是走了。我不确定这是因为这个新增内容还是我做错了什么。 @rookie 没有看到规则就很难确定。我怀疑这是因为目标文件位于out/ 中,但它正在当前目录中查找它们。但这只是猜测。 同意。您的规则肯定是错误的,但由于您既没有显示规则,也没有显示确切的错误信息,因此我们无话可说。 我在问题中添加了一些内容来澄清问题,希望对您有所帮助

以上是关于从不同的源文件夹在一个文件夹中创建目标文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 move_uploaded_file() 时如何在 PHP 中创建目标(文件夹)?

如何在反应 css 模块中创建全局设置文件

在UWP中创建/编写/压缩/解压缩文件

如何在目标 c 中创建 BOOL 实例变量?

CMake 错误:包含找不到加载文件:目标

如何在一个批处理文件中从一个源文件夹执行两个 ROBOCOPY 语句到两个目标文件夹?