在Objective-C编译过程中经历了什么过程

时间:2011-02-04 11:54:26

标签: objective-c compilation

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

有人可以概述一下编制过程中采取的步骤吗?

这是我目前理解的过程:

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

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

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

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

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

    感谢任何人可以为此带来任何启发:)。

    干杯,

    丹尼

1 个答案:

答案 0 :(得分:3)

你或多或少正确地理解了这个想法。一些更正:

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

  2. .m首先不会转换为C,然后转换为目标代码。这是20年前那样做的,但情况已不再如此。它只是直接编译成目标代码。

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

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

  5. 在任何情况下,您的结论都是正确的:您不应该将实现文件包含/导入到另一个实现文件中。您将遇到双重实现错误。