具有iphoneos和iphonesimulator体系结构的iOS通用框架
xcodebuild可以构建一个sdk设置为iphoneos或iphonesimulator的项目,但不能同时设置为两者,因此为了生成包含armv7 arm64和i386 x86_64体系结构的框架,我必须运行xcodebuild两次,然后使用lipo将所有体系结构组合成一个通用二进制文件。我看到商业框架会这样做,但它会导致一个不正确的info.plist文件,因为它有一个字段CbundleSupportedPlatforms,所有符号都指向它,仅包含1个值,例如CbundleSupportedPlatforms=iPhoneSimulator具有iphoneos和iphonesimulator体系结构的iOS通用框架,ios,xcode,xcodebuild,ios-frameworks,lipo,Ios,Xcode,Xcodebuild,Ios Frameworks,Lipo,xcodebuild可以构建一个sdk设置为iphoneos或iphonesimulator的项目,但不能同时设置为两者,因此为了生成包含armv7 arm64和i386 x86_64体系结构的框架,我必须运行xcodebuild两次,然后使用lipo将所有体系结构组合成一个通用二进制文件。我看到商业框架会这样做,但它会导致一个不正确的info.plist文件,因为它有一个字段CbundleSupportedPlatforms,所有符号都指向它,仅包含1个值,例如CbundleSupported
lipo似乎不应该以这种方式使用,因为xcodebuld没有正式支持它。有没有更好的方法来构建一个包含所有架构的框架 我遵循这个问题,但我想我有点困惑,为什么您希望不必要地扩展一个只有模拟器的i386和x84_64片的.framework,而这些片实际上只与您的开发版本相关。您是否会碰巧希望将一个框架分发给其他开发人员,并希望使其在模拟器和设备上工作 如果是这样,那么使用lipo将设备的精简二进制文件连接在一起或将模拟器的精简二进制文件连接在一起是正确的,但不应该尝试生成单个设备和模拟器框架。苹果自己对SDK和框架的使用在这里起到了指导作用。在Xcode中,有两个不同的平台SDK-iPhoneOS.platform和iPhoneSimulator.platform,其中包含的SDK仅包含相关目标体系结构的切片: 您可以深入到这些文件夹中的每一个,发现UIKit框架确实遵循每个平台的理念,并且根据正在使用的SDK有条件地链接: 我进一步猜测,您希望有一个通用的、全体系结构的框架,这样消费开发者就不必记得根据他们编译应用程序的方式将一个.framework文件换成另一个。好消息是,您可以使用条件链接标志来影响这一点,而无需进行文件系统交换 当人们采用您的库时,设置的一部分应该是使用条件链接-在其他链接器标志选项中,您可以具有每配置调试、发布、临时等生成设置,也可以具有每体系结构或每SDK的特定设置:
要访问这些特定于SDK的设置,您需要单击每个构建配置旁边的+,在那里您要自定义定制框架链接。然后,您可以从下拉列表中选择适当的SDK,并为两个目标框架中的每一个添加链接器标志。谢谢您的详细回答。您猜对了,我正在考虑将一个框架分发给其他开发人员,但您所说的是有道理的。但是有一件事,你的iPhoneOS.platform和iPhoneSimulator.platform的路径不再适用于Yosemite 10.10.4和Xcode 6.4,你知道它们可能在哪里吗?@Bob看起来你可能是基于Finder截图;浏览一下终端屏幕,了解完整路径。是的,你又对了,谢谢你的帮助。我应该提到的是,Crashlytics、Shinobi Charts和PSPDFKit等商业开发人员正在将这两个平台打包成1个二进制文件和框架,这与苹果自己的框架背道而驰。@BryanMusial那么链接器标志设置中有什么内容呢?我假设我编译了lib的两个版本:lib-sim.framework和lib-device.framework,并将它们复制到我的客户机项目中?但是,构建阶段部分“链接二进制与库”不允许每个sdk设置,因此我不知道如何将一个版本用于sim卡,另一个版本用于设备?我也对@Brynjar的相同内容感到困惑。我不确定在适当的情况下,链接器标志中包含哪些内容来排除每个框架。