*.d
我已经使用 make(使用)自动生成了依赖文件( ) 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)
文档中是否提到过,带有空配方的规则只会向现有规则添加先决条件?我之所以问这个问题,是因为我注意到它不使用此处定义的隐式规则。
是的,这很正常。任何给定目标最多只能有一个配方,并且 GCC 无法假定知道应该是什么。
GNU 手册在多处讨论了没有配方的规则,但也许存在缺陷,因为它没有在“规则语法”部分明确说明允许使用没有配方的规则。
是的,在第 4.11 节“一个目标的多个规则”的顶部:
这是 Unix 的一个长期特性
make
,而非 GNU 的创新。不,如果您为需要构建的目标提供显式规则,则不会。只有在给定目标没有提供配方的显式规则的情况下,才会考虑隐式规则。