【问题标题】:What Makefile rule is appending .c to a missing include?什么 Makefile 规则将 .c 附加到缺少的包含?
【发布时间】: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) 打印调试信息

标签: gcc makefile gnu-make


【解决方案1】:

基于 cmets,我现在运行 make 并进行调试。我发现 Make 正在对 include(file) 中包含的所有文件进行正常/预期的评估。包含文件的隐含规则是在它们不存在时尝试重建它们。由于这不是我想要的,我使用以下空的显式规则来覆盖该行为,并且对所有包含的文件不执行任何操作。就我而言,这很容易,因为它们都共享 .mak 扩展名。这是规则:

%.mak : ;

感谢那些添加反馈的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 2016-12-20
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多