×

.a .framework打包注意事项

96
_故事的小黄瓜_
2018.05.17 22:34 字数 437

静态库中使用了C++混编

我们都知道在OC项目中使用了C++文件来混编的话,就会报如图所示的错误。其最快捷的解决方法就是将项目中的一个文件的.m后缀改成.mm。

C++文件导致的错误.png

如果在制作静态库时也使用了C++,那开发者导入的静态库(.framework .a)。总不能让开发者自己在原项目中使用相同的方法,这样的体验会让开发者不能接受。解决方式:在项目中添加C++的标准库,libc++.tbd。这个库只有113K大小,基本不会影响项目的大小。

动态库和静态库

动态库.os 不适用于iOS项目
静态库.a和.framework 适用于iOS项目

判断IOS静态库(.a文件)是否支持模拟器和真机运行

lipo -info libMerculetSDK.a

Architectures in the fat file: libMerculetSDK.a are: i386 x86_64 armv7 arm64

armv7|armv7s|arm64都是ARM处理器的指令集
i386|x86_64 是Mac处理器的指令集

参考文档

当打包的静态库不满足项目的 architecture要求的时候,编译就会报错。

/// 静态库打包的时候遗漏armv7的真机
Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_XXXX", referenced from:
      objc-class-ref in XXXX.o
ld: symbol(s) not found for architecture armv7

那解决方法是什么呢?需要在打包前需要做一系列操作,如下。

合并模拟器和真机.a

lipo -create +(真机及模拟器的静态库文件)(直接拖动相应文件进来会自动生成地址) + -output +(输出的地址)
例如:

lipo -create **/libMerculetSDK.a **/libMerculetSDK.a -output **/libMerculetSDK.a

打包SDK之前需要注意的是:

  • 编译SDK工程之前,需要设置Build Active Architecture Only 为NO。


    image.png
  • build Configuration 设置为 Release。


    image.png
  • 设置bitcode
    一般地,iOS需要打包两种静态库,一种是bitcode,一种是非bitcode。xcode7之后系统会默认项目支持bitcode模式,如果项目不需要bitcode,则需要在build setting里面配置一下。


    Screen Shot 2018-05-17 at 10.18.21 PM.png

检测.a文件是否支持bitcode:

otool -arch armv7 -l **/libMerculetEncrypte.a  | grep __bitcode | wc -l

如果显示的数字不为0,说明静态库支持bitcode,否则不支持。

日记本
Web note ad 1