Gcc 在缺少的include后面追加.c是什么Makefile规则?

Gcc 在缺少的include后面追加.c是什么Makefile规则?,gcc,makefile,gnu-make,Gcc,Makefile,Gnu Make,在makefile中,有一条语句: 包括$(PROJECT\u CUSTOM\u DIR)/PROJECT\u CUSTOM.mak 在某些情况下,此文件将不存在。在这些情况下,我们得到的错误是“没有这样的文件或目录”。但是,似乎有一个隐式规则(或其他什么)附加了扩展名.c,该扩展名与编译.c到.o文件的标准规则之一相匹配,并尝试编译它 .c文件的默认规则如下所示: PROJECT_CUSTOM_DIR := . include $(PROJECT_CUSTOM_DIR)/project_

在makefile中,有一条语句:

包括$(PROJECT\u CUSTOM\u DIR)/PROJECT\u CUSTOM.mak

在某些情况下,此文件将不存在。在这些情况下,我们得到的错误是“没有这样的文件或目录”。但是,似乎有一个隐式规则(或其他什么)附加了扩展名
.c
,该扩展名与编译
.c
.o
文件的标准规则之一相匹配,并尝试编译它

.c
文件的默认规则如下所示:

PROJECT_CUSTOM_DIR   := .

include $(PROJECT_CUSTOM_DIR)/project_custom.mak

C_EXT             ?= c
CXX_EXT           ?= cpp
OBJ_EXT           ?= o

%.$(OBJ_EXT)        :   $(C_SRCS)
    $(COMPILE_C_COMMAND)
日志中的错误如下所示:

Makefile:10: project_custom.mak: No such file or directory
gcc -c -fvisibility=hidden -O3 -flto -mtune=generic project_custom.mak.c -o project_custom.mak.o
我读了很多书,试图确定这里发生了什么,我很困惑。有人能解释这种行为吗

另外,我知道添加破折号(如
-include file.mak
)会抑制关于找不到文件的错误。此外,禁用隐式规则在这里不是一个选项


谢谢

根据评论,我现在运行make进行调试。我发现Make正在对
include(file)
中包含的所有文件进行正常/预期的评估。包含文件的隐式规则是,如果它们不存在,则尝试重新生成它们。因为这不是我想要的,所以我使用了下面的空显式规则来覆盖该行为,并且不对所有包含的文件执行任何操作。在我的例子中,这很容易,因为它们都共享
.mak
扩展名。规则如下:

%.mak:


感谢那些添加反馈的人。

美元(C_SRCS)是如何生成的?在运行make之前,它是在一个单独的脚本中创建的,位于一个单独的.mak文件中。它包含在包含规则的文件之前。我将在2小时内仔细查看包含的顺序。
$(C\u SRSC)
不是您的问题。事实上,有些东西正试图构建
project\u custom.mak.o
。您可能需要运行
make--debug=b
,以了解为什么要构建它。你的bug超出了你发布的范围。表示如果您提到foo.o但没有为其提供规则,make将自动查找一个隐式规则,告诉您如何更新它。无论文件foo.o当前是否存在,都会发生这种情况。因此,如果
$(C\u SRCS)
包含
project\u custom.mak.C
,则make将使用C编译器gcc构建它。我将使用echo$(C_SRCS)