【发布时间】:2018-05-07 20:06:52
【问题描述】:
在makefile中,有一条语句:
include $(PROJECT_CUSTOM_DIR)/project_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 之类的破折号会抑制有关找不到文件的错误。此外,在这里禁用隐式规则不是一个选项。
谢谢!
【问题讨论】:
-
$(C_SRCS) 是如何产生的?
-
它在 make 运行之前在一个单独的脚本中创建,在一个单独的 .mak 文件中。它包含在带有规则的文件之前。我将在 2 小时内仔细查看包含的顺序。
-
$(C_SRSC)不是你的问题。正在尝试构建project_custom.mak.o的事实是。您可能想运行make --debug=b以查看为什么要构建它。您的错误超出了您发布的范围。 -
using implicit rules 说如果你提到 foo.o 但没有给出规则,make 会自动寻找一个隐含的规则来告诉如何更新它。无论文件 foo.o 当前是否存在,都会发生这种情况。所以如果
$(C_SRCS)包含project_custom.mak.c,那么make 将使用c 编译器gcc 来构建它。我会用echo $(C_SRCS)打印调试信息