-all_load链接器标志是做什么用的?

134

我无法找到有关编译Objective-C代码时-all_load标志的任何信息。

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

有人能帮助我吗?


2
通常,您在使用应用程序时会在设备上看到任何错误。您是说在提交给苹果审核之前没有在实际硬件上测试您的应用程序吗?如果是这样,那是一个非常非常糟糕的想法。 - Brad Larson
我已经测试过了,但是我的“分发”配置 - 使用应用商店预配资料文件的那个 - 没有标志,所有的测试都是使用开发资料文件进行的,该资料文件具有标志,因此一切似乎都很正常。当我使用分发资料文件为应用商店编译时,标志被关闭了,由于无法在本地安装分发资料文件,因此我无法检查它。 - Guy Ephraim
1个回答

154
这可能与这个技术笔记有关:https://developer.apple.com/library/content/qa/qa1490/_index.html 重要提示:对于64位和iPhone操作系统应用程序,存在一个链接器错误,阻止了在仅包含分类而没有类的静态库中加载目标文件的-ObjC。解决方法是使用-all_load或-force_load选项。-all_load强制链接器从它看到的每个存档中加载所有目标文件,即使其中没有Objective-C代码。-force_load在Xcode 3.2及更高版本中可用。它允许更精细的存档加载控制。每个-force_load选项必须跟随一个指向存档的路径,该存档中的每个目标文件都将被加载。

3
是的,这主要涉及到iPhone的静态库。如果它们没有使用这个链接标志进行编译,那么这些分类就不会被包含在构建的二进制文件中,任何使用这些静态库的应用程序在iPhone操作系统硬件上执行时都会出现运行时错误。 - Brad Larson
18
不行,因为这些分类是存在于编译时的,只不过它们没有被链接到最终二进制文件中。但由于 Obj-C 调度的动态性,链接器不会直接将调用代码指向实现方法,因此它永远不会注意到缺少的内容。然后在运行时,你会得到一个崩溃,就像你使用“-performSelector:”一样。 - Sophistifunk
16
想要澄清技术说明:大多数情况下,您需要使用-ObjC链接器标志,而不是-all_load。仅在(我会假设很少见的)库中没有类,只有分类时,建议使用-all_load。 - Chris Hill
4
根据 https://dev59.com/pXE85IYBdhLWcg3w3Xr6#2615407 的说法,自 XCode 4.2 起已经修复了这个问题,因此您不再需要使用 -all_load 或 -force_load 标志。但您仍需要使用 -ObjC。 - Liron Yahdav
2
现在,在技术问答中甚至没有提到-all_load-force_load - ThomasW
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接