【问题标题】:How do you call a rule that involves `%` from another rule in a Makefile?您如何从 Makefile 中的另一个规则中调用涉及 `%` 的规则?
【发布时间】:2017-04-10 14:04:29
【问题描述】:

我有以下 makefile sn-p 来编译我的 C++ 项目。

obj/%.o: src/%.cpp
    $(CXX) $(CFLAGS) -c $< -o $@

现在我想链接.o 文件。但我希望能够只调用链接的规则名称,例如 make build/main,以便编译 AND 链接。

这都不是:

build/main: $(wildcard obj/*.o)
    $(CXX) $^ -o $@

有效,因为它只链接而不编译,正如this answer 所期望的那样;

也不是这个:

build/main: obj/%.o
    $(CXX) $^ -o $@

出现错误:

'build/main' 需要目标'obj/%.o' 没有规则。停下来。

即使它是必需的。

【问题讨论】:

  • build/main: $(wildcard obj/*.o) 不起作用,因为通配符将在第一次读取规则时扩展(在构建 .o 之前,在它们存在于文件系统之前,所以它会扩展为空)。

标签: makefile wildcard


【解决方案1】:
SOURCES := $(wildcard src/*.cpp)
OBJECTS := $(patsubst src/%.cpp, obj/%.o, $(SOURCES))

build/main: $(OBJECTS)
    $(CXX) $^ -o $@

【讨论】:

  • SOURCES 是否扩展为 src/main.cpp src/other.cppmain.cpp other.cpp
  • @kim366:你自己看看:把$(info it expands to $(SOURCES))放在作业后面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多