美文网首页iOS开发SwiftiOS逆向程序员
SwiftCafe 咖啡时光 - 用 lipo 命令了解静态库

SwiftCafe 咖啡时光 - 用 lipo 命令了解静态库

作者: SwiftCafe | 来源:发表于2015-10-24 06:53 被阅读515次

我们平时开发 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

相关文章

网友评论

  • Kent_Zhang:一个静态库包含多种架构的代码是苹果自家特色,windows和linux都没有这种特性。这种玩法叫做fat binary,运行时系统会根据自身架构去调用相应代码,但相应的会使得二进制包fat一点。然而linux等Unix类系统对多平台代码的支持方式是编译时根据configure生成的配置头文件做相应适配,然后用交叉工具链近行编译。这就产生一个略麻烦的问题,移植ffmpeg等库到ios或者mac平台式,需要多次configure后编译生成各种平台的静态库,然后lipo到一起。
    Kent_Zhang:@SwiftCafe 不用谢,我也是最近才知道这些东西,以前都不知道的
    SwiftCafe:@Kent_Zhang 👍🏻 多谢补充 又丰富了些知识

本文标题:SwiftCafe 咖啡时光 - 用 lipo 命令了解静态库

本文链接:https://www.haomeiwen.com/subject/hrpthttx.html