我有一个非ARC项目,它使用支持ARC的静态库。这是一个受支持的方案,所以一切正常。也就是说,直到我在4.x设备上运行代码,包括模拟器。在这种情况下,代码会出现以下链接器错误:
dyld: lazy symbol binding failed: Symbol not found: _objc_storeStrong
Referenced from: /Users/zoul/Library/Application Support/iPhone Simulator/4.3.2/Applications/…/Demo.app/Demo
Expected in: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation
只要某些启用ARC的代码尝试调用_objc_storeStrong
函数,就会发生这种情况,就像init
方法(self = [super init]
)一样。将主项目转换为ARC可以解决问题,但我想知道是否还有其他解决方案。
答案 0 :(得分:30)
我认为工具链可能添加了必要的库链接,以便ARC正常工作。因此链接器转录本可能包含这条信息。如果应用程序本身的项目未启用ARC,则默认情况下可能无法获取这些项目,但您仍可以通过明确定义它们来链接它们。
查看构建脚本您确实可以在那里找到适当的链接器标志:它被称为-fobjc-arc
(就像相关的编译器标志一样)。将此设置添加到其他链接器标志时,链接器将包含带有主构建产品的ARC库,并且代码应运行正常。
答案 1 :(得分:5)
我正在为此添加一个新的答案,因为先前接受的解决方案似乎不再适用于Xcode 4.3.2。我只能假设-fobjc-arc
链接器标志从未被暴露过,现在已被删除。
这似乎是一个众所周知的问题,尽管the only thread I can find on this与苹果公司的评论人员发表评论可追溯到2011年年中。从该线程,建议手动链接以下文件解决问题:
${DEVROOT}/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a
这要求您使用最新的编译器/ SDK进行编译。我在没有测试的情况下提交这个答案,如果有效,请提出请求,如果没有,请提出请求!