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



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

我假设工具链可能已经添加了必要的库来链接,以便ARC正常工作。所以链接器转录本可能包含这条信息。如果应用程序本身的项目没有启用ARC,默认情况下你可能不会得到这些,但你仍然可以通过显式定义它们来链接到它们。

查看构建脚本,您确实可以在其中找到合适的链接器标志:它被称为-fobjc-arc(就像相关的编译器标志一样)。当您将此设置添加到其他链接器标志时,链接器将包括主构建产品的ARC库,并且代码应该运行良好。

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

这似乎是一个已知的问题,尽管我能找到的关于这个问题的唯一线索是苹果公司的人在开发者论坛上发表评论,可以追溯到2011年年中。从该线程中,建议手动链接以下文件来解决问题:

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

不过,这需要您使用最新的编译器/SDK进行编译。我在没有测试的情况下提交了这个答案,如果有效,请投赞成票,如果无效,请投反对票!

最新更新