iOS开发之常用技术点程序员程序猿阵线联盟-汇总各类技术干货

.a .framework打包注意事项

2018-05-17  本文已影响159人  王大吉Rock

静态库中使用了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之前需要注意的是:

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读