【问题标题】:Why does makefile automatically generate object file(*.o) without any specific rule?为什么makefile会自动生成目标文件(*.o)而没有任何特定规则?
【发布时间】:2016-01-18 16:18:50
【问题描述】:

我最近正在学习编写makefile。我正在阅读的所有文档都告诉我,我必须编写一个规则来执行命令。 但是我发现下面的 Makefile 可以在没有任何编译命令的情况下生成目标文件。为什么?

SOURCES=$(wildcard  src/*.c)
OBJECTS=$(patsubst %.c, %.o, $(SOURCES))

all: $(OBJECTS)

当我在终端输入 make 时,我得到了这个:

cc -c -o xxx.o xxx.c

这是怎么发生的?

【问题讨论】:

  • 继续阅读,直到您到达关于内置规则的章节。

标签: c makefile


【解决方案1】:

为什么makefile会自动生成object file(*.o)而没有任何 具体规则?

因为它有一套内置规则。


Make 使用如下隐式规则:

%.o: %.c  
    $(CC) $(CPPFLAGS) $(CFLAGS) -c

%: %.o    
    $(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)

您可以使用make -p 查看所有这些。而make -d显示应用的规则。

正如 Ian Abbott 在评论中指出的那样:

make -p 需要从没有 makefile 的目录运行(并且 没有 Makefile,也没有 GNUmakefile)。

另请参阅相关的 GNU make documentation

还有这个post

【讨论】:

  • 为避免混淆,make -p 需要从没有 makefile(也没有 Makefile,也没有 GNUmakefile)的目录运行。
  • 谢谢你的澄清,我会添加它
  • 即使在带有 makefile 的目录中,您也可以看到哪些规则是内置的(它在 -p 输出中),但如果 makefile 覆盖它们,您可能会错过一些内置规则。
猜你喜欢
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多