【问题标题】:Does every .h file have a corresponding object file?每个 .h 文件都有对应的目标文件吗?
【发布时间】:2018-03-28 18:49:55
【问题描述】:

我正在尝试编写一个 makefile,但我并不真正了解目标文件是如何工作的。我的文件夹中没有.o 文件,那么我该如何编译它们呢?每个.h 文件是否都有对应的.o?如果不是,那么我们如何知道是否必须编译目标文件?抱歉,如果这些是愚蠢的问题,我是编程新手。

谢谢。

【问题讨论】:

  • 如果您只是声明结构而不是函数,则不需要 .o 文件。
  • 每个 .c 文件都被编译器编译成 .o。 .h 文件是否存在以及它们的作用取决于程序员。它们只是依赖关系,它们不会创建自己的目标文件。
  • 您可以将函数放在与调用者相同的.c 文件中,同时仍然有一个单独的.h 文件用于声明,但这样做是不正当的。
  • 我明白了。假设我正在尝试通过 makefile 编译程序,并且该程序依赖于 2 个 .c 文件,这两个文件都没有它们所依赖的 .h 文件。当我编译.o文件时,我只需要写下相应的.c文件作为它们所依赖的文件,对吧?
  • @GoodDeeds 啊,这可以解释为什么有时这个人不会回复。非常感谢!

标签: c makefile compilation object-files


【解决方案1】:

基本上,头文件 (.h) 告诉编译器在生成对象 (.o) 文件时存在事物。编译器从源文件 (.c/.cpp/etc.) 生成目标文件。如果编译器不具体了解某些内容,它会假定标头是正确的,并为链接器留下一个“名称”。

链接器将获取目标文件并通过将目标代码中的“名称”替换为其他目标文件中的代码来生成可执行文件。

这是对所发生情况的非常高级概述。关于细节的页面有很多很多。

【讨论】:

    【解决方案2】:

    一个简单的答案来说明整体概念:

    每个 .c 文件都包含由编译器翻译成包含机器代码的 .o 文件的程序代码。

    通常将不同的 .c 文件组合到一个软件中。但是他们必须 以某种方式连接。因此他们的 .o 文件必须连接到 可执行。这就是链接器的作用。

    .h 文件描述 .c 文件的连接点。

    链接器使用 .c 文件连接来生成软件。

    这是一个简化,但是:

    例如,链接器不参考 .h 文件。他们只是服务 编译器告诉他某个符号是链接器必须解析的连接点。

    .h 文件是为了方便软件开发人员。当 .c 文件具有链接器的“连接点”时,其对等 .h 文件可能会将它们全部列出。 如果另一个 .c 文件想要使用它们,它可能只包含相应的 .h 文件。但这只是一个约定。理论上,只有 .c 文件是必不可少的。从理论上讲,每个软件项目都可以仅使用 .c 文件编写(但是,大部分时间都没有)。

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      相关资源
      最近更新 更多