iOS 具有 iphoneos 和 iphonesimulator 架构的通用框架
iOS universal framework with iphoneos and iphonesimulator architectures
xcodebuild
可以构建一个 sdk 设置为 iphoneos
或 iphonesimulator
但不能同时设置的项目,因此为了生成包含 armv7 arm64
和 i386 x86_64
架构,我必须 运行 xcodebuild
两次,然后使用 lipo
将所有架构组合成 1 个通用二进制文件。我看到这样做的商业框架,但它导致了一个不正确的 info.plist
文件,因为它有一个字段 CFBundleSupportedPlatforms
,并且所有指向它的标志都只包含 1 个值,例如 CFBundleSupportedPlatforms = ( "iPhoneSimulator" )
。
似乎 lipo
不应该以这种方式使用,因为 xcodebuld
未正式支持它。有没有更好的方法来构建一个包含所有架构的框架?
我回答了这个问题,但我想我有点困惑为什么你要用仅与模拟器相关的 i386 和 x84_64 切片不必要地膨胀一个 .framework
开发构建。您是否偶然想将一个框架分发给其他开发人员并想让它在模拟器和设备上运行?
如果是这样,那么您使用 lipo
将设备的精简二进制文件连接在一起或将模拟器的精简二进制文件连接在一起是正确的,但不应尝试生成一个设备和模拟器框架。 Apple 自己对 SDK 和框架的使用在此作为指南。在 Xcode 中,有两个不同的平台 SDK -- iPhoneOS.platform 和 iPhoneSimulator.platform,它们包含仅包含相关目标架构切片的 SDK:
您可以深入了解这些文件夹中的每一个,发现 UIKit 框架确实遵循每个平台的想法,并且根据正在使用的 SDK 有条件地链接:
我进一步猜测您希望拥有一个通用的、全架构的框架,以便开发人员不必记住根据他们编译应用程序的方式将一个 .framework 文件换成另一个。好消息是您可以使用条件链接标志来影响这一点,而无需进行文件系统交换!
当人们采用您的库时,设置的一部分应该是使用条件链接——在 OTHER_LINKER_FLAGS
选项中,您可以根据配置(调试、发布、临时等)构建设置,也可以有每个架构或每个 SDK 的特定设置:
要访问这些特定于 SDK 的设置,您需要单击要自定义框架链接的每个构建配置旁边的 +。然后,您可以 select 从下拉列表中选择合适的 SDK,并为两个目标框架中的每一个添加链接器标志。
xcodebuild
可以构建一个 sdk 设置为 iphoneos
或 iphonesimulator
但不能同时设置的项目,因此为了生成包含 armv7 arm64
和 i386 x86_64
架构,我必须 运行 xcodebuild
两次,然后使用 lipo
将所有架构组合成 1 个通用二进制文件。我看到这样做的商业框架,但它导致了一个不正确的 info.plist
文件,因为它有一个字段 CFBundleSupportedPlatforms
,并且所有指向它的标志都只包含 1 个值,例如 CFBundleSupportedPlatforms = ( "iPhoneSimulator" )
。
似乎 lipo
不应该以这种方式使用,因为 xcodebuld
未正式支持它。有没有更好的方法来构建一个包含所有架构的框架?
我回答了这个问题,但我想我有点困惑为什么你要用仅与模拟器相关的 i386 和 x84_64 切片不必要地膨胀一个 .framework
开发构建。您是否偶然想将一个框架分发给其他开发人员并想让它在模拟器和设备上运行?
如果是这样,那么您使用 lipo
将设备的精简二进制文件连接在一起或将模拟器的精简二进制文件连接在一起是正确的,但不应尝试生成一个设备和模拟器框架。 Apple 自己对 SDK 和框架的使用在此作为指南。在 Xcode 中,有两个不同的平台 SDK -- iPhoneOS.platform 和 iPhoneSimulator.platform,它们包含仅包含相关目标架构切片的 SDK:
您可以深入了解这些文件夹中的每一个,发现 UIKit 框架确实遵循每个平台的想法,并且根据正在使用的 SDK 有条件地链接:
我进一步猜测您希望拥有一个通用的、全架构的框架,以便开发人员不必记住根据他们编译应用程序的方式将一个 .framework 文件换成另一个。好消息是您可以使用条件链接标志来影响这一点,而无需进行文件系统交换!
当人们采用您的库时,设置的一部分应该是使用条件链接——在 OTHER_LINKER_FLAGS
选项中,您可以根据配置(调试、发布、临时等)构建设置,也可以有每个架构或每个 SDK 的特定设置:
要访问这些特定于 SDK 的设置,您需要单击要自定义框架链接的每个构建配置旁边的 +。然后,您可以 select 从下拉列表中选择合适的 SDK,并为两个目标框架中的每一个添加链接器标志。