美文网首页iOS杂技IOS知识积累iOS开发实用技巧
iOS解决两个静态库(.framework或.a)中.o文件冲突

iOS解决两个静态库(.framework或.a)中.o文件冲突

作者: cukiy | 来源:发表于2018-12-05 15:11 被阅读0次
    项目中使用到TXLiteAVSDK_UGC.framework(腾讯短视频)和BaiduMapAPI_Map.framework(百度地图)中的两个.o文件有冲突, 查了资料通过拆分TXLiteAVSDK_UGC.framework删除其中冲突的.o文件,然后重新生成静态库, 解决了问题. Snip20181205_7.png

    步骤如下:

    1. 新建一个文件夹resolveConflict, 将TXLiteAVSDK_UGC.framework复制到resolveConflict文件夹内.TXLiteAVSDK_UGC.framework内容如图, TXLiteAVSDK_UGC就是我们要拆分的文件


      Snip20181205_6.png
    1. 打开终端, cd到TXLiteAVSDK_UGC.framework下, 执行
    $ lipo -info TXLiteAVSDK_UGC
    

    终端会显示该库包含的cpu架构

    Architectures in the fat file: TXLiteAVSDK_UGC are: armv7 i386 x86_64 arm64

    这里介绍一下各类设备对应的cpu架构
    模拟器包含的cpu架构:
    iPhone 4s – iPhone 5 : i386
    iPhone SE : x86_84
    iPhone5s – iPhone 7 Plus : x86_64
    真机设备包含的cpu架构
    iPhone 3g – iPhone 4s : armv7
    iPhone 5 – iPhone 5c : armv7s
    iPhone SE : arm64
    iPhone 5s – iPhone 7 Plus : arm64
    只要支持了armv7就不用再支持armv7s

    3 . 执行如下命令, 从TXLiteAVSDK_UGC中拆分出arm64架构对应的.a库并命名为TXLiteAVSDK_UGC_arm64.a

    $ lipo TXLiteAVSDK_UGC -thin arm64 -output TXLiteAVSDK_UGC_arm64.a
    

    然后同样的方法修改架构名拆分出其他3种cpu架构对应的.a库, 拆分完如下图

    $ lipo TXLiteAVSDK_UGC -thin armv7 -output TXLiteAVSDK_UGC_armv7.a
    $ lipo TXLiteAVSDK_UGC -thin i386 -output TXLiteAVSDK_UGC_i386.a
    $ lipo TXLiteAVSDK_UGC -thin x86_64 -output TXLiteAVSDK_UGC_x86_64.a
    
    Snip20181205_5.png
    1. 将各个.a库拆分.o文件.最好每个架构的.a库都放到一个独立的文件夹中拆分, 不然4个架构的.a库拆分后所有的.o文件混在一起就乱了

    在TXLiteAVSDK_UGC.framework根目录新建文件夹名为arm64, 将TXLiteAVSDK_UGC_arm64.a拖进该文件夹, 然后cd到arm64文件夹, 执行如下命令

    $ ar -x TXLiteAVSDK_UGC_arm64.a
    
    Snip20181205_3.png

    这样TXLiteAVSDK_UGC_arm64.a就被拆分成很多的.o文件. 在里面找到造成冲突的.o文件删除掉. 从第一张图的错误信息可以看出是gmm_gmr.o文件有冲突, 所以就把这个文件删了


    ![Snip20181205_1.png](https://img.haomeiwen.com/i3962148/f36479b46f0274a6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    第一张图中的错误信息里显示的只有arm64架构有冲突, 因为我是用真机测试的, 前面也介绍了各类设备对应的cpu架构, 所以要在模拟器或是其他设备上也能正常运行, 就需要把其他3个cpu架构的.a库重复这一步进行拆分并删除其中冲突的.o文件

    1. 然后就是把拆分后的文件重新生成.framework静态库. 在arm64文件夹里执行如下命令
    $ libtool -static -o ../TXLiteAVSDK_UGC_arm64.a *.o
    

    生成了一个新的arm64架构的.a库. 切换文件夹并重复该命令将被拆分的其他cpu架构的库重新生成.

    1. 将所有cpu架构的.a库进行合并. 需要先把TXLiteAVSDK_UGC文件删除掉, 因为合并之后的文件最好跟之前名字一样, 不影响正常使用. 删掉TXLiteAVSDK_UGC之后执行如下命令
    $ lipo -create -output TXLiteAVSDK_UGC TXLiteAVSDK_UGC_arm64.a TXLiteAVSDK_UGC_armv7.a TXLiteAVSDK_UGC_i386.a TXLiteAVSDK_UGC_x86_64.a
    

    这样就把4个.a库合并成了名为TXLiteAVSDK_UGC的文件

    1. 最后恢复到第一步图中的结构, 把多余的文件都删掉就完成了 . 把新的TXLiteAVSDK_UGC.framework放到项目中, 再次运行就不会冲突了.

    相关文章

      网友评论

        本文标题:iOS解决两个静态库(.framework或.a)中.o文件冲突

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