【问题标题】:What does the -all_load linker flag do?-all_load 链接器标志有什么作用?
【发布时间】:2011-02-23 18:29:18
【问题描述】:

在编译 Objective-C 代码时,我在任何地方都找不到 -all_load 标志的作用。

我在将二进制文件上传到 Apple 时遇到了一些问题,他们说这是因为我没有使用此标志,但即使没有它,我的代码也能编译。

有人可以帮我吗?

谢谢

【问题讨论】:

  • 通常情况下,您看到的任何错误都会在运行应用程序时发生在设备上。您是说在提交 Apple 审核之前您没有在实际硬件上测试您的应用程序吗?如果是这样,那是一个非常非常糟糕的主意。
  • 我已经对其进行了测试,但是我的“分发”配置 - 带有应用商店配置文件的那个 - 没有标记,所有测试都是使用开发配置文件完成的标记,所以一切似乎都正常,当我使用分发配置文件为应用商店编译它时,该标记已关闭,并且由于无法在本地安装分发配置文件,我无法检查它。

标签: iphone objective-c gcc linker


【解决方案1】:

大概和这个技术说明https://developer.apple.com/library/content/qa/qa1490/_index.html有关

重要提示:对于 64 位和 iPhone OS 应用程序,存在阻止 -ObjC 从仅包含类别且不包含类的静态库加载对象文件的链接器错误。解决方法是使用 -all_load 或 -force_load 标志。 -all_load 强制链接器从它看到的每个存档中加载所有目标文件,即使是那些没有 Objective-C 代码的文件。 -force_load 在 Xcode 3.2 及更高版本中可用。它允许对存档加载进行更细粒度的控制。每个 -force_load 选项后面必须跟一个存档路径,并且该存档中的每个目标文件都将被加载。

【讨论】:

  • 是的,这主要用于 iPhone 的静态库。如果在没有此链接器标志的情况下编译它们,则这些类别不会包含在构建的二进制文件中,并且任何使用这些静态库的应用程序在 iPhone OS 硬件上执行时都会出现运行时错误。
  • 编译时不应该出现一些缺少方法的警告或错误吗?
  • 不,因为类别存在于编译时,它们只是没有链接到最终的二进制文件中。但是由于 Obj-C 调度的动态特性,链接器不会将调用代码直接指向实现方法,因此它永远不会注意到它丢失了。然后在运行时,你会得到 kaboom,就像你使用“-performSelector:”调用它一样
  • 只是想澄清技术说明:大多数情况下,您需要 -ObjC 链接器标志,而不是 -all_load。 -all_load 建议在(我假设很少见)实例中您有一个没有类的库,只有类别。
  • 根据stackoverflow.com/a/2615407/62,这已在 XCode 4.2 中修复,因此您不再需要 -all_load 或 -force_load 标志。你仍然需要 -ObjC。
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 2010-11-18
  • 2018-05-21
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多