
我们平时开发 APP 的时候,不免会使用各种静态库,无论是第三方的,还是苹果原生提供的。在使用这些静态库的时候,也难免会出现各种冲突。比如两个静态库内部都引用了同样的第三方库,就会造成命名冲突。
再比如,某些静态库不支持 arm
系列平台,这样就导致我们使用这个静态库的 APP 不能编译到真机上,等等。
关于静态库的种种问题,相信大家或多或少都会遇到过。咱们今天就来了解一个和静态库相关的命令 lipo
。帮助我们解开静态库的面纱。
首先,我们拿到一个静态库后,我们如何知道这个静态库都支持拿些平台呢,这时就可以使用 lipo -info
命令。以 UMeng 统计的静态库为例:
$ lipo libMobClickLibrary.a -info
Architectures in the fat file: libMobClickLibrary.a are: i386 armv7 armv7s x86_64 arm64
lipo
命令立即输出了这个静态库所支持的平台 - i386 armv7 armv7s x86_64 arm64
, 我们看到 Umeng 这个静态库,同时支持了模拟器的 i386 x86_64
平台,还有 iPhone 上面的 armv7 armv7s arm64
平台。一目了然,非常直观。
我们可以用 lipo
查看静态库支持的平台,同样我们也能用 lipo 删除某些平台。假如我们不需要我们的 UMeng 库支持模拟器平台,那么我们就可以使用 -remove
参数来删除模拟器的两个平台:
$ lipo libMobClickLibrary.a -remove i386 -output libMobClickDevice.a
$ lipo libMobClickDevice.a -remove x86_64 -output libMobClickDevice.a
运行这两个命令,就可以删除原来两个静态库的 i386 x86_64
两个体系架构的支持了。我们可以用 -info
参数来验证一下:
$ lipo libMobClickDevice.a -info
Architectures in the fat file: libMobClickDevice.a are: armv7 armv7s arm64
果然,我们最后输出的这个静态库现在之支持 iPhone 设备的几个平台了。如果我们用这个静态库编译到模拟器平台上,就会报错啦。
除了拆分平台,lipo
还能够将多个静态库合并起来,比如当我们自己开发一个静态库的时候,需要这个库同时支持模拟器和真机平台。Xcode 默认的编译选项是不支持这种静态库打包的,Xcode 只能对真机或者模拟器分别打出 .a 文件。比如这样:
myLibDevice.a // armv7 armv7s arm64
myLibSimulator.a // i386 x86_64
我们可以用 lipo
将这两个库合并到一起:
$ lipo -create myLibDevice.a myLibSimulator.a -output myLibUniversal.a
用 -create
参数指定两个输入文件,然后用 -output
参数指定输出文件的名称。这样输出的这个 .a 文件就集成了多平台能力。而这一切操作起来相当简单,只需要一条命令即可,非常的方便。
关于 lipo
更详细的介绍,各位朋友就是用 man lipo
命令自行查看吧~
配合 Xcode 的脚本能力,lipo 可以实现更强大的自动化构建能力。这个咱们后期继续讨论吧。
更多精彩内容可关注微信公众号:
swift-cafe
![]()
网友评论