ARC支持的静态库链接到非ARC项目,导致链接器错误

时间:2012-01-06 10:29:16

标签: objective-c xcode automatic-ref-counting

我有一个非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可以解决问题,但我想知道是否还有其他解决方案。

2 个答案:

答案 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进行编译。我在没有测试的情况下提交这个答案,如果有效,请提出请求,如果没有,请提出请求!