【问题标题】:Makefile wildcard issueMakefile通配符问题
【发布时间】:2019-04-09 03:53:21
【问题描述】:

我正在尝试编写一个 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))

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

然后它抱怨主函数太多(1 类和 2 类)。

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

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

但是,由于某种原因,OBJS_1 似乎没有得到应用于$(OBJS) 的过滤器

【问题讨论】:

    标签: makefile wildcard


    【解决方案1】:

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

    在您的情况下,您只需要执行字符串替换,并且 make 中字符串的“全部匹配”模式是一个百分号。所以应该是:

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

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

    【讨论】:

    • 感谢您的回复。我应该更具体地说明我想要做什么。我只想过滤掉该目录中的文件(而不是子目录中的文件)。这似乎无法正常工作。但这绝对让我走上了正轨。
    • 我设法通过将我想要控制的文件直接放在他们自己的文件中来使其工作,但不知道如果不这样做我将如何解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多