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

zou*_*oul 24 xcode objective-c 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
Run Code Online (Sandbox Code Playgroud)

只要某些启用ARC的代码尝试调用_objc_storeStrong函数,就会发生这种情况,就像在initmethod(self = [super init])中一样.将主项目转换为ARC可以解决问题,但我想知道是否还有其他解决方案.

jus*_*tin 30

我假设工具链可能添加了必要的库链接,以便ARC正常工作.因此链接器转录本可能包含这条信息.如果应用程序本身的项目未启用ARC,则默认情况下可能无法获取这些项目,但您仍可以通过显式定义它们来链接它们.

查看构建脚本,您确实可以在那里找到适当的链接器标志:它被调用-fobjc-arc(就像相关的编译器标志一样).将此设置添加到其他链接器标志时,链接器将包含带有主构建产品的ARC库,并且代码应运行正常.

  • 我可以确认这在Xcode 4.3.2中有效.我刚刚做了,编译器在为模拟器构建时没有抱怨任何事情. (3认同)
  • 从Xcode 4.3.2开始,这似乎不再适用.`-fobjc-arc`似乎是lib工具的无效标志.("-fobjc-arc中的未知选项字符`f'") (2认同)

Luk*_*ath 5

我正在为此添加一个新的答案,因为先前接受的解决方案似乎不再适用于Xcode 4.3.2.我只能假设-fobjc-arc链接器标志永远不会被暴露,现在已被删除.

这似乎是一个众所周知的问题,尽管我可以在这篇文章中发现的唯一主题是苹果公司对devforums的评论可以追溯到2011年年中.从该线程,建议手动链接以下文件解决问题:

${DEVROOT}/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a
Run Code Online (Sandbox Code Playgroud)

这需要您使用最新的编译器/ SDK进行编译.我在没有测试的情况下提交了这个答案,如果有效的话请提出请求,如果没有,请提出请求!