Dan*_*nny 5 compilation objective-c
我在尝试编译Objective-C程序时遇到了一些链接器问题,并认为我无法弄清楚问题的原因可能是由于对编译器进程的无知.
是否可以让某人概述编译过程中采取的步骤?
这是我目前了解的过程:
编译器将任何包含的.h文件的内容复制到它所定义的文件中.编译器不会跟踪是否已包含.h文件,因此它可能会多次包含在项目中.
任何.m文件都被编译为C等效代码(它们又被编译为目标代码).
链接器在.h文件中生成的声明与目标代码中的相应函数之间生成链接.通过在同名的.m文件中查找它们来确定适当的函数.
目标文件连接在一起形成可执行文件,确保main函数位于可执行文件的入口点.然后可能会删除任何声明以节省空间?
假设这是正确的(可能不是这样),这可能意味着您永远不应该#include .m文件,因为您可能最终会遇到多个方法定义,这会导致链接器出现问题.
感谢任何人可以带来的任何照明:).
干杯,
丹尼
你的想法或多或少是正确的。一些更正:
#include不检查它是否已包含,但#import会检查。
.m不是先转换为 C,然后再转换为目标代码。20年前是这样的,但现在不再是这样了。它只是直接编译为目标代码。
链接器不关心文件是如何命名的。.h您可以为和使用不同的文件名.m。例如,您可以将文件中声明的函数的实现拆分.h为多个文件。.m
是否删除未使用的实现取决于编译器和编译器选项。
无论如何,您的结论是正确的:您永远不应该将一个实现文件包含/导入到另一个实现文件中。您将遇到双重执行错误。
| 归档时间: |
|
| 查看次数: |
1099 次 |
| 最近记录: |