Makefile 通配符问题

Makefile wildcard issue

我正在尝试编写一个 makefile 以有选择地包含某个文件。

我已经设法让它与以下项目一起工作:

OBJS := $(filter-out ./build/./src/class_1.cpp.o, $(OBJS))
OBJS := $(filter-out ./build/./src/class_2.cpp.o, $(OBJS))

OBJS_1 :=./build/./src/class_1.cpp.o $(OBJS)
OBJS_2 := ./build/./src/class_2.cpp.o $(OBJS)

但我想让它更通用并使用通配符。

我的理解是以下应该有效:

OBJS := $(filter-out $(wildcard ./build/./src/*), $(OBJS))

我也试过了

OBJS := $(filter-out $(wildcard \./build/\./src/*), $(OBJS))

但不确定问题是出在特殊符号上还是只是基本理解。

然而它会抱怨主要功能太多(class 1 和 class 2)。

我对 make 中的通配符和过滤器的理解有什么遗漏吗?

如果我用两种不同的方法打印出 $(OBJS) 的值,这些值是相同的,所以我不确定为什么一个解决方案可以工作而另一个解决方案失败。

但是,由于某些原因,OBJS_1 似乎没有得到应用于 $(OBJS)

的过滤器

$(wildcard ...) 函数查找文件系统中实际存在的文件(部分或全部 .o 文件可能在 make 执行期间创建,因此结果会因最后一条命令而异)。这肯定不是你想要的。

在您的情况下,您只需执行字符串替换,make 中字符串的 'match-all' 模式是百分号。所以应该是:

OBJS:=$(filter-out ./build/./src/%,$(OBJS))

另请注意,makefile 中的空格可能很重要。例如,$(filter a, b) 表示第二个参数是“b”,而不仅仅是 "b"。即使在您的情况下无关紧要,您也应该更加谨慎地使用空格。