-all_load链接器标志有什么作用?


123

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

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

有人可以帮我吗?

谢谢


2
通常,您在运行应用程序时会在设备上看到与此相关的任何错误。您是说您在提交苹果审查之前没有在实际硬件上测试您的应用程序吗?如果是这样,那是一个非常非常糟糕的主意。
布拉德·拉尔森

我已经对其进行了测试,但是我的“分发”配置(具有应用商店配置文件的配置)没有该标志,并且所有测试都是使用带有该标志的开发配置文件完成的,因此一切正常,何时我使用分发配置文件为应用程序商店编译了该标志,该标志已关闭,并且由于无法在本地安装分发配置文件,因此无法对其进行检查。
Guy Ephraim 2010年

Answers:


144

可能与此技术说明有关: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选项必须后跟档案的路径,并且该档案中的每个目标文件都将被加载。


3
是的,这主要与iPhone的静态库有关。如果在不使用此链接器标志的情况下进行编译,则类别不包括在构建的二进制文件中,并且使用这些静态库的任何应用程序在iPhone OS硬件上执行时都会出现运行时错误。
布拉德·拉尔森

1
编译时不应该有关于缺少方法的警告或错误吗?
Guy Ephraim 2010年

18
不,因为类别在编译时存在,所以它们只是没有链接到最终的二进制文件中。但是由于Obj-C分派的动态性质,链接器不会将调用代码直接指向实现方法,因此它永远不会注意到它的丢失。然后在运行时,您将获得kaboom,就像您使用“ -performSelector:”调用它一样:
Sophistifunk 2010年

14
只想澄清技术说明:大多数时候,您会需要-ObjC链接器标志,而不是-all_load。-all_load建议在(我假设很少)实例中使用,该实例中没有类,只有类。
克里斯·希尔

3
根据stackoverflow.com/a/2615407/62,此问题已从XCode 4.2开始修复,因此您不再需要-all_load或-force_load标志。您仍然需要-ObjC。
Liron Yahdav 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.