我已经使用make(使用
*.d
)自动生成了依赖文件(g++ -MMD
),在这些文件中我看到创建的规则没有任何配方。此外,从我的测试中,我注意到后续构建(在创建 *.d
之后)仍将使用我在 Makefile 中定义的配方:
CPPFLAGS := -Iinclude
CXXFLAGS := -std=c++20 -Wall -Wextra -Werror -MMD
%.o: %.cpp
# recipe below used when building from dependency files!
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o$@ $<
-include $(DEPS_FILES)
在文档中是否提到过,带有空配方的规则只是为现有规则添加了先决条件?我这么问是因为我注意到它没有使用here定义的隐式规则。
在这些文件中,我看到创建的规则没有任何配方。
是的,这很正常。对于任何给定的目标最多只能有一个配方,并且 GCC 不能假定知道那应该是什么。
GNU 手册在多个地方讨论了没有配方的规则,但可能会因为没有在“规则语法”部分明确说明允许没有配方的规则而受到指责。
文档中是否提到过具有空配方的规则只是为现有规则添加了先决条件?
一个文件可以是多个规则的目标。所有规则中提到的所有先决条件都将合并到目标的一份先决条件列表中。如果目标早于任何规则的任何先决条件,则执行配方。
这是 Unix 的长期功能
make
,而不是 GNU 的创新。
我问是因为我注意到它不使用隐式规则
不是为需要构建的目标提供明确规则的地方,不是。 仅当给定目标没有规则提供配方时才考虑隐式规则。