GNU 中的 patsubst 使 returns 什么都没有

patsubst in GNU make returns nothing

我试图将我的 cpp 源文件和我的目标文件放在不同的目录中,所以我试图使用 Make 的 patsubst 来替换路径。在什么都没有编译之后,我做了一个假目标来简单地打印出相关变量,我发现 patsubst 没有返回任何东西。这对我来说意义不大,据我所知,与模式不匹配的目标应该原封不动地通过,所以即使我的模式格式不正确,我仍然应该看到 东西 返回。

我的变量是这样声明的:

SRC_DIR := source/
SRC := $(wildcard $(SRC_DIR)*.cpp)

OBJ_DIR := obj/
OBJ := $(PATSUBST $(SRC_DIR)%.cpp, $(OBJ_DIR)%.o, $(SRC))

我只是打印出上述变量的假目标看起来像这样:

.PHONY: print
print:
    @echo $(SRC_DIR)
    @echo $(SRC)
    @echo $(OBJ_DIR)
    @echo $(OBJ)

运行 make print 的结果是:

user@athena:~/proj$ make print
source/
source/main.cpp source/util.cpp
obj/

user@athena:~/proj$ 

我尝试过的其他东西

我试过 SRC_DIR 和 OBJ_DIR 有尾部斜线但没有它们,我试过 $(SRC:$(SRC_DIR)%.cpp=$(OBJ_DIR)%.o) 没有 工作, 和 $(OBJ) 将同时具有 main.o 和 util.o,但是我的静态规则 ($(OBJ): $(OBJ_DIR)%.o : $(SRC_DIR)%.cpp) 只会触发 main.cpp,并且不会尝试编译util.cpp,我正在考虑一个完全不同的问题?

我希望我只是在做一些愚蠢的事情并且有一个简单的修复方法,但我一直在绞尽脑汁,我看不出是什么导致 patsubst 只是空白。任何帮助将不胜感激。

与(实际上)所有编程语言一样,makefile 区分大小写。 $(FOO)$(foo) 不同,$(PATSUBST ...)$(patsubst ...) 不同。

事实上,$(PATSUBST ...)什么也没有,展开为空字符串。