gpt4 book ai didi

makefile - 在makefile中编写编译规则时,如何剥离源文件的路径?

转载 作者:行者123 更新时间:2023-12-03 15:32:24 26 4
gpt4 key购买 nike

简而言之:我想编译来自不同目录的源,并将目标文件放入当前目录。

例如,我有以下文件:

test.c
../../lib1/boot.c
../../lib2/startup.c
../common/utils.c

(还有.s(程序集)和.cpp文件,但是我希望这并不重要)。

我想将其所有目标文件放在当前目录中:
test.o
boot.o
startup.o
utils.o

而且我不知道如何在我的makefile中编写这样的规则。

例如,
%o.: %.c

由于 make找不到从 boot.o构建 ../../lib1/boot.c的规则,它现在不能工作,它只能从 ../../lib1/boot.o构建 ../../lib1/boot.c的规则。

我试图用这个:
%o.: %.c
(my compilation line, for example "gcc -c $^ -o $@")
%o.: ../../lib1/%.c
(my compilation line)
%o.: ../../lib2/%.c
(my compilation line)
%o.: ../common/%.c
(my compilation line)

它的工作原理。但这显然不够通用,此外,今天有一些用户来找我,说他的应用程序也有 ../../some_other_lib/common_things.c,因此我的makefile失败了。我浏览了我们的项目,发现许多涉及许多不同目录的情况。用我的方法,我必须为每个这样的目录编写一个单独的规则,并使用相同的编译行。这对我来说似乎不好。

所以我的问题是:如何制定一些通用的编译规则,以将对象文件放入(检查)当前目录中,同时使用不同目录中的源代码进行操作?

谢谢你。

最佳答案

可以使用CSRC$(dir ...)变量中提取目录,然后可以在vpath指令中使用此列表。

vpath %.c $(sort $(dir $(CSRC)))
vpath %.s $(sort $(dir $(SSRC)))
vpath %.cpp $(sort $(dir $(CPPSRC)))

(我抛出了 sort函数来删除重复项,但这不是绝对必要的。)

现在,可以使规则保持简单,并且 make将在目录列表中搜索源文件。
$(COBJ) := $(notdir $(CSRC))
$(SOBJ) := $(notdir $(SSRC))
$(CPPOBJ) := $(notdir $(CPPSRC))

.PHONY: all
all: $(EXECUTABLE)

$(EXECUTABLE): $(COBJ) $(SOBJ) $(CPPOBJ)
....

$(COBJ): %.o: %.c
...

$(SOBJ): %.o: %.s
...

$(CPPOBJ): %.o: %.cpp
...

关于makefile - 在makefile中编写编译规则时,如何剥离源文件的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15340725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com