静态库中使用了C++混编
我们都知道在OC项目中使用了C++文件来混编的话,就会报如图所示的错误。其最快捷的解决方法就是将项目中的一个文件的.m后缀改成.mm。
![](https://img.haomeiwen.com/i3011588/5a070ed6be147b30.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,否则不支持。
网友评论