【问题标题】:How does make build an executable file from a C source file when the implicit rule says nothing about executables?当隐式规则没有说明可执行文件时,make 如何从 C 源文件构建可执行文件?
【发布时间】:2019-04-17 12:34:43
【问题描述】:

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 文件,只有可执行文件。如果.c 程序的隐含规则说它应该构建一个.o 文件,那么make 如何从源文件构建可执行文件?

【问题讨论】:

    标签: c makefile compilation executable


    【解决方案1】:

    内置数据库有不同的隐含规则。如果模式规则不明确,make 永远不会反对,因为它总是为它们设置优先级。

    在这种情况下,规则 %: %.o%.o: %.c 被规则 %: %.c 取代(因为一步优于两步 ;-)),它编译成可执行文件而无需创建目标文件(是的, gcc 可以做到这一点)。

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

    make helloworld.o helloworld
    

    这里,成功创建 helloworld.o 后,make 会优先使用 %: %.o 规则而不是 %: %.c,所以它可以正常工作。

    【讨论】:

      【解决方案2】:

      有很多隐含的规则。在这种情况下,有一个用于直接从 C 文件构建可执行文件。在make -d helloworld 的输出中,您应该看到如下内容:

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

      找到“helloworld”的隐含规则。

      【讨论】:

      • 谢谢!你是对的。运行 make -d 时我确实得到了这些行
      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      相关资源
      最近更新 更多