ld:在iOS 4.3上复制符号_objc_retainedObject,但不在iOS 5.0上

一些背景 – 我使用Diney的指南在http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/上构build了一个自定义框架

它为armv6 / armv7构build,它是一个基于ARC的框架,编译4.3的解构目标。

当我把结果框架在一个5.0项目,它的工作很好,但是当我把它放在一个4.3项目(ARC或非弧,没有关系),我得到以下,我不明白…

我也尝试手动添加libarclite.a,但它并没有改变任何东西。

ld:在/Users/freak4pc/Project/MyFramework.framework/MyFramework和/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(arclite.o)中复制符号_objc_retainedObject用于架构armv7 Command / Developer /Platforms/iPhoneOS.platform/Developer/usr/bin/clang失败,退出代码1

希望对此有帮助。
谢谢
夏嘉曦

我正在努力解决同样的问题。 解决方法是这样设置框架的部署目标到iOS5(检查是否不会产生其他问题)。

那么你必须在主项目中使用ARC,否则libarclite将会丢失。 我的解决scheme是提供两个框架,取决于是否使用ARC。

这里有两个链接到苹果的开发论坛与一点点信息: https : //devforums.apple.com/message/539344#539344

https://devforums.apple.com/message/588316#588316

更新:有一个更好的方法。 只要build立你的静态库与iOS5的最低目标,并手动添加/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(和/Developer/usr/lib/arc/libarclite_iphonesimulator.a),如果你的项目使用ARC,需要iOS4支持。

更新2:实际上,只需使用链接器标志-fobjc-arc; 如果它不在那里,这将把libarclite和图书馆联系起来。 最佳解决scheme

哇,这是一个艰难的骑,但我终于解决了!

是什么引发了最后的想法是@ steipete的评论,这是一个复杂的情况,所以我会试图解释它为任何人也可能已经越过这个问题。

  1. 在iOS 4.3上编译一个支持ARC的框架将会自动附加libarclite.so来将4.3 ARC与“ARC”连接起来。 当这个框架被导入到4.3项目中时,arclite实际上被连接了两次 – 一次是框架(4.3),另一次是项目本身 – 导致了“重复符号”错误,意味着框架必须被编译5.0,而这个项目可以是4.3。 但是之后 ;
  2. 我的框架是使用@mattt的AFNetworking来执行不同AP的HTTP请求和JSONparsing。 如果您的目标是iOS5,AFNetworking会在编译时自动检查,如果是,则使用NSJSONSerialization ,否则它将回退到任何导入的JSON库(如JSONKit
  3. 当编译我的支持AFNetworking的iOS5框架(为了避免第一个问题)时,它会自动附加NSJSONSerialization ,这会在4.3项目上引发一个exception,这意味着你将不得不手动查找编译指令并移除对NSJSONSerialization编译之前,所以它会自动回落到4.3兼容的库(在我的情况下JSONKit )。 该编译条件可在AFHTTPClient.m和AFJSONRequestOperation.m(例如#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 || __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6 )上find。
  4. 删除这些条件后,我用JSONKit而不是NSJSONSerialization成功编译了iOS5的框架,并成功地在我的iOS4.3项目中使用它。

希望这可以帮助其他任何可能与我一样挣扎几天的人:)

夏嘉曦。