在创建通用静态库时使用 lipo 与“有效架构”

Posted

技术标签:

【中文标题】在创建通用静态库时使用 lipo 与“有效架构”【英文标题】:using lipo vs "valid architecture" while creating universal static library 【发布时间】:2014-12-19 19:49:26 【问题描述】:

我想创建一个通用静态库,例如 sampleStaticLib.a,它包含在一个名为 HelloWorld 的应用程序中。 HelloWorld 应用需要使用静态库中定义的 API,并且需要在 ios 模拟器和 iOS 设备上运行。我从网上的各种帖子了解到,我可以通过使用lipo工具将模拟器和设备的静态库聚合成一个通用库,然后将通用库包含在HelloWorld.xcodeproj中。

但是,或者,如果我执行以下操作:

只需在静态库xcodeproject中设置有效架构 (sampleStaticLib.xcodeproj)到“armv7 armv7s arm64 i386 x86_64 生成sampleStaticLibrary.a 将其包含在 HelloWorld.xcodeproj 中

我的期望是,由于我将“sampleStaticLib”的有效架构设置为跨 x86 和 ARM 的所有架构,因此该库应该可以在模拟器和设备上运行。但它在模拟器上不起作用。

那么,在创建通用静态库时,不能设置一个广泛的“有效架构”来替代使用“lipo 工具”的需要吗?

【问题讨论】:

【参考方案1】:

不,很遗憾,这不可能像您希望的那样简单。

原因是当您构建项目时,它将使用所选 SDK 为所有请求的架构构建。 iOS SDK 支持 ARM,iOS Simulator SDK 支持 Intel。您需要针对 iOS SDK 构建 ARM 切片,针对 iOS Simulator SDK 构建 Intel 切片,然后将它们组合成通用二进制文件。

【讨论】:

谢谢杰里米。在那种情况下, VALID_ARCHS = "armv7 armv7s arm64 i386 x86_64" 在 iOS SDK 中是什么意思?我在几篇文章中看到了这样的设置。如果 iOS 设备甚至不支持这些架构,那么“i386”和“x86_64”如何适应这个空间,正如您在下面的链接中看到的那样? developer.apple.com/library/mac/documentation/DeveloperTools/… 这是可以选择的列表。通常,开发人员通过在项目窗口左上角选择具有活动方案的设备或模拟器来选择架构。如果开发者选择 iPhone5 设备,那么活动架构是 armv7。如果选择了 iPhone3GS,Xcode 会报错,因为 armv6 不在列表中。 @WaltSellers:如果没有 iOS 设备运行这些架构,为什么还要将架构“i386”和“x86_64”添加到此列表中? (至少直到今天)。即使 x86 架构未包含在“VALID_ARCHS”中,默认的 xcodeproject 也会在模拟器上运行。 Xcode 在为 sim 构建时将 arm64 转换为 x86_64,将 armv7 转换为 i386。【参考方案2】:

它应该工作。比如这个静态库

https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/blob/v3/png/prebuilt/ios/libpng.a

它有 armv7、armv7s、arm64、i386 和 x86_64 二进制文件。

$ file libpng.a 
libpng.a: Mach-O universal binary with 5 architectures
libpng.a (for architecture armv7):  current ar archive random library
libpng.a (for architecture armv7s): current ar archive random library
libpng.a (for architecture i386):   current ar archive random library
libpng.a (for architecture x86_64): current ar archive random library
libpng.a (for architecture cputype (16777228) cpusubtype (0)):  current ar archive random library <-- It's arm64

Xcode(Clang toolchain) 可以为 iOS 设备和 iOS 模拟器链接这个静态库。而且完全没有问题。

但它在模拟器上不起作用。

什么意思?我建议您更详细地更新有关它的问题。

【讨论】:

以上是关于在创建通用静态库时使用 lipo 与“有效架构”的主要内容,如果未能解决你的问题,请参考以下文章

如何从iOS中的静态库构建胖库时从libWebRTC.a静态库中删除x86_64 architechture?

ios 创建自己的.a文件

typedef 结构在链接静态库时会导致名称冲突吗?

lipo操作

通用框架:Xcode 无法识别的平台

深入理解计算机系统CSAPP Ch7:静动态库制作与神奇的库打桩机制