2

我的 C++ 项目的源文件组织在./src. 我的 makefile 中有一个模式规则,它将所有.cpp源文件编译成对象:

$(OBJDIR)/%.o: %.cpp makefile
    $(CXX) -c $< -o $@

由于我使用的是这种模式而不是为每个源文件编写编译规则,因此我需要告诉make递归地./src查看这些先决条件。现在我有:

VPATH := $./src/:./src/folder1:./src/folder2:./src/folder3

这行得通,但是当我不可避免地忘记添加新文件夹时,它感觉很不雅,并且还会导致错误。

希望有人有更好的解决方案!

4

2 回答 2

2

VPATH您可以通过搜索子目录并用冒号替换空格来自动构建变量:

space :=
space +=
VPATH := $(subst $(space),:,$(shell find src -type d))

这假设您的目录或文件名中没有空格。

使用这种方法,如果两个不同子目录中的两个源文件具有相同的名称,我不清楚你会做什么——但这似乎与你的整体设置更相关,而不是你关于VPATH具体的问题。

有关$(space)变量技巧,请参阅GNU Make博客文章中漂亮的转义逗号和空格。

于 2019-01-15T03:47:25.050 回答
1

gmake 本身没有任何递归目录遍历的功能,所以你必须求助于$(shell ...)

VPATH := $(shell find src -type d -print | tr '\012' ':' | sed 's/:$$//')

调整 shell 脚本以获得正确的语义。您想使用:=运算符,以便评估一次。

于 2019-01-15T03:43:06.047 回答