【问题标题】:iOS universal framework with iphoneos and iphonesimulator architectures具有 iphoneos 和 iphonesimulator 架构的 iOS 通用框架
【发布时间】:2015-07-22 23:12:50
【问题描述】:

xcodebuild 可以构建一个 sdk 设置为 iphoneosiphonesimulator 但不能同时设置的项目,因此为了生成包含 armv7 arm64i386 x86_64 架构的框架,我必须运行 xcodebuild两次,然后使用lipo 将所有架构组合成一个通用二进制文件。我看到执行此操作的商业框架,但它会导致不正确的 info.plist 文件,因为它有一个字段 CFBundleSupportedPlatforms 并且所有标志都指向它只包含 1 个值,例如 CFBundleSupportedPlatforms = ( "iPhoneSimulator" )

似乎lipo 不应该以这种方式使用,因为它不受xcodebuld 的官方支持。有没有更好的方法来构建一个包含所有架构的框架?

【问题讨论】:

    标签: ios xcode xcodebuild ios-frameworks lipo


    【解决方案1】:

    我关注这个问题,但我想我有点困惑,为什么您要使用仅与您的开发构建相关的仅模拟器 i386 和 x84_64 切片不必要地膨胀单个 .framework。您是否希望将一个框架分发给其他开发人员并使其在模拟器和设备上运行?

    如果是这样,您使用lipo 将设备的精简二进制文件连接在一起或将模拟器的精简二进制文件连接在一起是正确的,但不应该尝试生成一个设备和模拟器框架。 Apple 自己使用的 SDK 和框架可作为此处的指南。在 Xcode 中,有两个不同的平台 SDK——iPhoneOS.platform 和 iPhoneSimulator.platform,它们包含的 SDK 只包含相关目标架构的切片:

    您可以深入这些文件夹中的每一个,发现 UIKit 框架确实遵循每个平台的想法,并且根据正在使用的 SDK 有条件地链接:

    我进一步猜测您希望拥有一个通用的全架构框架,以便使用开发人员不必记住根据他们编译应用程序的方式将一个 .framework 文件换成另一个。好消息是您可以使用条件链接标志来影响这一点,而无需进行文件系统交换!

    当人们采用您的库时,部分设置应该是使用条件链接——在OTHER_LINKER_FLAGS 选项中,您可以进行每个配置(调试、发布、临时等)构建设置,还可以也有每个架构或每个 SDK 的特定设置:

    要访问这些特定于 SDK 的设置,您需要单击要自定义框架链接的每个构建配置旁边的 +。然后,您可以从下拉列表中选择适当的 SDK,并为两个目标框架中的每一个添加链接器标志。

    【讨论】:

    • 感谢您的详细解答。您猜对了,我正在考虑将一个框架分发给其他开发人员,但您说的很有道理。不过有一件事,对于 Yosemite 10.10.4、Xcode 6.4,你到 iPhoneOS.platform and iPhoneSimulator.platform 的路径不再存在,知道它们可能在哪里吗?
    • @Bob 看起来您可能是基于 Finder 屏幕截图;查看终端屏幕以获取完整路径。
    • 是的,你又是对的,感谢你的帮助。我应该提一下,像 Crashlytics、Shinobi Charts 和 PSPDFKit 这样的商业开发人员正在将这两个平台打包成一个二进制文件和框架,这与 Apple 自己的框架相反。
    • @BryanMusial 那么链接器标志设置中有什么?我假设我编译了我的 lib 的 2 个版本:lib-sim.framework 和 lib-device.framework 并将它们都复制到我的客户端项目中?但是随后构建阶段部分“将二进制文件与库链接”不允许每个 sdk 设置,所以我看不到如何将一个版本用于 sim 而另一个版本用于设备?
    • 我也对与@Brynjar 相同的事情感到困惑。我不确定在适当情况下排除每个框架的链接器标志是什么。
    猜你喜欢
    • 2014-08-13
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多