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

Objective c 静态库,带有链接到非ARC项目的ARC支持,导致链接器错误,objective-c,xcode,automatic-ref-counting,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/Applicati

我有一个非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的代码尝试调用
\u objc\u storeStrong
函数时,就会发生这种情况,就像在
init
方法中一样(
self=[super init]
)。将主项目转换为ARC解决了这个问题,但我想知道是否还有其他解决方案。

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


查看构建脚本,您确实可以在那里找到合适的链接器标志:它被称为
-fobjc arc
(与相关的编译器标志一样)。当您将此设置添加到其他链接器标志时,链接器将包括带有主生成产品的ARC库,代码应该运行正常。

我将添加一个新的答案,因为以前接受的解决方案似乎不再适用于Xcode 4.3.2。我只能假设,
-fobjc-arc
链接器标志从未被认为是公开的,现在已经被删除

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

${DEVROOT}/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a

但这需要您使用最新的编译器/SDK进行编译。我未经测试就提交此答案,如果有效请向上投票,如果无效请向下投票

您是否使用支持ARC的LLVM进行链接?首先:当主项目启用ARC时,工具链可能刚刚添加了一个库来链接。如果你在成绩单中找不到它,那么你可以通过ARC编译一个源代码来链接到它。这是个好主意,@Justin!使用单个启用ARC的文件的技巧不起作用,但我成功地找到了链接器包含库的正确参数,并且似乎起了作用。你能回答这个问题吗?一个简单的就可以了,我会编辑它来添加细节。@zoul太棒了!回答补充道。编辑离开=)非常感谢,经过一个下午的努力,这个答案是一个救命稻草!从Xcode 4.3.2开始,这似乎不再起作用<代码>-fobjc arc似乎是lib工具的无效标志。(:-fobjc arc中的未知选项字符'f')我可以确认这在Xcode 4.3.2中起作用。我就这么做了,编译器在构建simulator.Upvoting时没有抱怨任何事情,因为这是一个有用的补充。还没有测试。DEVROOT似乎对我不起作用。我在库搜索路径中使用了:
$(PLATFORM\u DEVELOPER\u USR\u DIR)/lib/arc
,并为
-larclite\u iphoneos
添加了一个特定于设备的链接器标志,这是一个有用的补充,但我还没有找到为什么在链接器标志中添加-fobjc arc仍然适用于我的Xcode 4.3.2的原因