6

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

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

4

1 回答 1

5

我跟着这个问题,但我想我有点困惑,为什么你要不必要地膨胀一个.framework只有模拟器的 i386 和 x84_64 切片,这些切片实际上只与你的开发版本相关。您是否偶然想要将一个框架分发给其他开发人员并希望它在模拟器和设备上工作?

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

Xcode 的平台选项

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

UIKit 脂质体

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

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

其他链接器标志

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

于 2015-07-24T22:58:12.740 回答