12


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

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

当我将生成的框架放入 5.0 项目时效果很好,但是当我将其放入 4.3 项目(ARC 或非 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 命令/Developer /Platforms/iPhoneOS.platform/Developer/usr/bin/clang 失败,退出代码为 1

将不胜感激任何帮助。
谢谢

4

2 回答 2

15

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

如果目标是 iOS4,那么你必须在主项目中使用 ARC,否则 libarclite 将丢失。我的解决方案是提供两个框架,这取决于他们是否使用 ARC。

这是苹果开发论坛的两个链接,其中包含更多信息: https ://devforums.apple.com/message/539344#539344

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

更新:有更好的方法。只需使用 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 与库链接。最佳解决方案。

于 2011-12-06T18:58:42.063 回答
2

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

引发最终想法的是@steipete 的评论,它的情况有点复杂,所以我会尝试为任何可能遇到此问题的人解释它。

  1. 在 iOS 4.3 上编译支持 ARC 的框架会自动将 libarclite.so 附加到带有 5.0 ARC 的“桥”4.3 ARC。当这个框架被导入到 4.3 项目时,arclite 实际上被链接了两次——一次用于框架(即 4.3),一次用于项目本身——这导致了“重复符号”错误,这意味着必须编译框架5.0,项目可以是4.3。但是之后 ;
  2. 我的框架正在使用 @mattt 的 AFNetworking 来执行不同 API 的 HTTP 请求和 JSON 解析。AFNetworking 在编译时自动检查您的目标是否为 iOS5 ,如果是,则使用NSJSONSerialization,否则将回退到任何导入的 JSON 库,例如JSONKit.
  3. 在为 iOS5 编译支持 AFNetworking 的框架时(为了避免出现问题 1),它会自动附加NSJSONSerialization,这将导致 4.3 项目出现异常,这意味着您必须在编译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
  4. 删除这些条件后,我成功地使用 JSONKit 而不是 NSJSONSerialization 编译了我的 iOS5 框架,并且成功地能够在我的 iOS4.3 项目中使用它。

希望这会帮助像我这样可能会为此挣扎几天的其他人:)

谢。

于 2011-12-07T12:49:22.580 回答