【问题标题】:makefile flatten objects into one directorymakefile 将对象扁平化到一个目录中
【发布时间】:2018-10-31 17:25:37
【问题描述】:

最近我们的项目结构发生了变化,现在我们有了子目录。我的旧 makefile 假设并只是说:

SOURCES := $(wildcard $(SRCDIR)/*.cpp)
OBJECTS := $(SOURCES:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)

现在有了任意深度嵌套目录,它改为

SOURCES := $(wildcard $(SRCDIR)/**/*.cpp)

但我仍然希望所有对象都放在同一个目录中,我将如何更改 OBJECTS(或编译?)定义以使其不会失败,因为对象目录中不存在给定的子目录。

编辑: 有人将此标记为重复 Getting make to create object files in a specific directory

现在我被要求说这有什么不同。我觉得这是侮辱性的,因为我为什么要提供为什么这是重复的原因。将其标记为重复的人应提供原因。

我什至不知道从哪里开始,为什么它会有所不同。您不妨将我链接到一些 excel 问题,然后问我为什么它不同。

向我解释为什么链接的问题应该回答我的问题,然后我会告诉你它是或不是。

【问题讨论】:

  • 首先,您的声明SOURCES := $(wildcard $(SRCDIR/**/*.cpp) 不会像您期望的那样做(在$(SRCDIR) 下的各级目录中查找*.cpp 的所有实例)。 ** 工具是一些 shell(如 zsh)支持的高级类型的 globbing,但它不受标准 C glob() 函数的支持,这是 make 用于 wildcard 的函数。您的 globbing 表达式在功能上与 $(SRCDIR)/*/*.cpp 相同(正好是一个目录级别)。要查找您需要的所有文件$(shell find $(SRCDIR) -name \*.cpp)
  • 其次,我同意链接的重复问题并不完全相同,但是当您寻求帮助时,被试图回答您问题的人侮辱是不合适的。也许您没有看到引用的问题如何适用,那么您可以要求澄清,但没有必要如此积极地回应。我想说一个更好的重复问题是:stackoverflow.com/questions/52974743/… 实际上给出的答案与下面提供的 Beta 完全相同。

标签: makefile


【解决方案1】:

没问题,只需使用几个text manipulation functions

OBJECTS := $(patsubst %.cpp,$(OBJDIR)/%.o,$(notdir $(SOURCES)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多