Objective-C的编译过程是什么

Objective-C的编译过程是什么,objective-c,compilation,Objective C,Compilation,我目前在编译Objective-C程序时遇到了一些链接器问题,我认为我无法解决这个问题的原因可能是由于对编译过程的无知 有人能给我一个在编译过程中采取的步骤的概述吗 这是我目前理解的过程: 编译器将包含的任何.h文件的内容复制到定义该文件的文件中。编译器不跟踪.h文件是否已经包含,因此它可能多次包含在项目中 任何.m文件都被编译成C等价代码(反过来又被编译成目标代码) 链接器在.h文件中的声明和目标代码中的相应函数之间生成链接。通过在同名的.m文件中查找函数来确定适当的函数 目标文件连接在一起形

我目前在编译Objective-C程序时遇到了一些链接器问题,我认为我无法解决这个问题的原因可能是由于对编译过程的无知

有人能给我一个在编译过程中采取的步骤的概述吗

这是我目前理解的过程:

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

  • 任何.m文件都被编译成C等价代码(反过来又被编译成目标代码)

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

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

  • 假设这是正确的(可能不是),这可能意味着您永远不应该包含.m文件,因为您可能会得到多个方法定义,这将导致链接器出现问题

    感谢任何人对此的启发:)

    干杯


    丹尼

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

  • #include
    不会检查它是否已经包含,但
    #import
    会进行检查

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

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

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


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

    啊哈,这太棒了;现在清楚多了,我已经解决了我的链接器问题!非常感谢!:)