当隐式规则对可执行文件一无所知时,make如何从C源文件构建可执行文件?

时间:2019-04-17 12:34:44

标签: c makefile compilation executable

根据GNU Make Manual,我了解ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonData); //jsonData is your json string here... JsonNode names = rootNode.path("name"); Iterator<JsonNode> elements = names.elements(); while(elements.hasNext()){ JsonNode name = elements.next(); System.out.println("Names are = "+name); } 程序有一个隐含规则:

  

n.o由n.c自动生成,格式为“ $(CC)$(CPPFLAGS)$(CFLAGS)-c”

例如,当我键入.c并且在工作目录中只有一个make helloworld文件时,我看到执行了以下操作:

helloworld.c

如果键入cc helloworld.c -o helloworld,我将发现make -d helloworld永远不会寻找中间make文件。

最后,我在目录中没有看到helloworld.o文件,只有可执行文件。如果.o程序的隐式规则表示应建立make文件,则.c如何从源文件构建可执行文件?

2 个答案:

答案 0 :(得分:2)

内置数据库中有不同的隐式规则。如果模式规则模棱两可,请make绝不反对,因为它总是为它们设置优先级。

在这种情况下,规则%: %.o%.o: %.c被规则%: %.c取代(因为一个步骤胜于两个步骤;-)),该规则的确编译为可执行文件,而没有曾经创建过目标文件(是的,gcc可以做到这一点)。

但是,您可以使用以下命令强制创建.o:

make helloworld.o helloworld

在这里,成功创建helloworld.o之后,make将更喜欢%: %.o规则而不是%: %.c,因此它可以按预期工作。

答案 1 :(得分:1)

有很多隐式规则。在这种情况下,有一个可以直接从C文件构建可执行文件的程序。在make -d helloworld的输出中,您应该看到类似以下内容的

  

尝试隐式先决条件“ helloworld.c”。

     

找到了“ helloworld”的隐式规则。