1

我想创建一个通用静态库,比如 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 工具”的需要吗?

4

2 回答 2

1

不,不幸的是,这不可能像您希望的那样简单。

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

于 2014-12-19T20:49:48.157 回答
0

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

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 模拟器链接这个静态库。而且完全没有问题。

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

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

于 2014-12-19T19:59:24.620 回答