gpt4 book ai didi

objective-c - Objective-C编译时经历了哪些过程

转载 作者:太空狗 更新时间:2023-10-30 03:53:43 27 4
gpt4 key购买 nike

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

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

这是我目前理解的流程:

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

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

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

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

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

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

干杯,

丹尼

最佳答案

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

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

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

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

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

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

关于objective-c - Objective-C编译时经历了哪些过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4897678/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com