从GNU Make Manual我了解到.c
程序有一个隐含的规则:
n.o是从n.c自动生成的,形式为'$(CC)$(CPPFLAGS)$(CFLAGS)-c'
例如,当我输入make helloworld
并且在我的工作目录中只有一个helloworld.c
文件时,我看到执行以下操作:
cc helloworld.c -o helloworld
如果我输入make -d helloworld
,我发现make
在任何时候都不会寻找中间的helloworld.o
文件。
最后,我没有在我的目录中看到.o
文件,只看到可执行文件。如果make
程序的隐式规则说它应该构建一个.c
文件,.o
如何从源文件构建可执行文件?
内置数据库中有不同的隐式规则。如果模式规则含糊不清,那就永远不要反对,因为它总是为它们设定优先级。
在这种情况下,规则%: %.o
和%.o: %.c
被规则%: %.c
取代(因为一步优于两个;-)),它在没有创建目标文件的情况下编译成可执行文件(是的,gcc可以这样做)。
但是,您可以使用此命令强制.o创建:
make helloworld.o helloworld
在helloworld.o成功创建之后,make会更喜欢%: %.o
统治%: %.c
,所以它按预期工作。
有许多隐含的规则。在这种情况下,有一个用于直接从C文件构建可执行文件。在make -d helloworld
的输出中你应该看到类似的东西:
尝试隐含的先决条件'helloworld.c'。
找到了'helloworld'的隐含规则。