【问题标题】:What is the process gone through during Objective-C compilationObjective-C编译的过程是怎样的
【发布时间】:2011-02-04 11:54:26
【问题描述】:

我目前在尝试编译 Objective-C 程序时遇到了一些链接器问题,并认为我无法弄清楚问题的原因可能是由于对编译器过程的无知。

有人可以给我一个编译过程中所采取的步骤的概述吗?

这是我目前理解的流程:

  1. 编译器会将任何包含的 .h 文件的内容复制到定义它的文件中。编译器不会跟踪 .h 文件是否已被包含,因此它可能包含在项目多次。

  2. 任何 .m 文件都被编译为 C 等效代码(这些代码又被编译为目标代码)。

  3. 链接器在 .h 文件中的声明和目标代码中的相应函数之间产生链接。通过在同名的 .m 文件中查找它们来确定适当的函数。

  4. 目标文件连接在一起形成可执行文件,确保主函数位于可执行文件的入口点。然后可能会删除任何声明以节省空间?

假设这是正确的(可能不正确),这可能意味着您永远不应该#include .m 文件,因为您最终可能会得到多个方法定义,这会导致链接器问题。

感谢任何人都可以带来的任何启发:)。

干杯,

丹尼

【问题讨论】:

    标签: objective-c compilation


    【解决方案1】:

    你的想法或多或少是正确的。一些更正:

    1. #include 不会检查它是否已经包含在内,但#import 会检查。

    2. .m 不是先转换为 C 再转换为目标代码。 20 年前就是这样做的,但现在已经不是这样了。它只是直接编译成目标代码。

    3. 链接器不关心文件的命名方式。您可以为.h.m 使用不同的文件名。例如,您可以将.h 文件中声明的函数的实现拆分为多个.m 文件。

    4. 是否删除未使用的实现取决于编译器和编译器选项。

    无论如何,您的结论是正确的:您永远不应该将一个实现文件包含/导入到另一个实现文件中。您将遇到双重实现错误。

    【讨论】:

    • 啊哈,太棒了;现在更清楚了,我已经解决了我的链接器问题!非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多