.a .framework打包注意事项

作者: 王大吉Rock | 来源:发表于2018-05-17 22:34 被阅读159次

    静态库中使用了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,否则不支持。

    相关文章

      网友评论

        本文标题:.a .framework打包注意事项

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