美文网首页iOS DeveloperIOS知识积累Kevin的IOS开发专题
iOS项目中引用多个第三方库引发冲突的解决方法

iOS项目中引用多个第三方库引发冲突的解决方法

作者: 7分醉 | 来源:发表于2016-02-23 14:29 被阅读7928次

    iOS程序开发过程中引用多个第三方库时会出现类名重叠,导致冲突,具体的冲突错误提示如下:

    duplicate symbol OBJC_IVAR$_AFHTTPSessionManager._requestSerializer in:

    /Users/username/work/Test/libxxxxxx1.a(AFHTTPSessionManager.o)

    /Users/username/work/Test/libxxxxxx2.a(AFHTTPSessionManager.o)

    解决方式

    1. 使用命令将 .a 库中相同的包
    2. 在编译链接项中添加-dead_strip项

    使用命令将 .a 库中相同的包

    1. 创建临时文件夹,用于存放armv7平台解压后的.o文件:mkdir armv7

    2. 取出armv7平台的包:lipo libx.a -thin armv7 -output armv7/libx-armv7.a

    3. 查看库中所包含的文件列表:ar -t armv7/libx-armv7.a

    4. 解压出object file(即.o后缀文件):cd armv7 && ar xv libx-armv7.a

    5. 找到冲突的包(AFHTTPSessionManager),删除掉rm AFHTTPSessionManager.o

    6. 重新打包object file:cd .. && ar rcs libx-armv7.a armv7/*.o,可以再次使用[2]中命令确认是否已成功将文件去除

    7. 将其他几个平台(armv7s, i386, arm64, x86_64)包逐一做上述[1-6]操作

    8. 重新合并为fat file的.a文件:
      lipo -create libx-armv7.a libx-armv7s.a libx-i386.a -output libSDK-new.a

    9. 拷贝到项目中覆盖源文件:
      cp libSDK-new.a /Users/tony/Desktop/XXXProject/Lib/libSDK.a

    在编译链接项中添加-dead_strip项

    在Build Settings->Other link flags中添加-dead_strip,如果Other link flags中有-all_load与-force_load则删掉,只填-dead_strip

    关于Xcode的Other Linker Flags 的介绍请参考此处

    -dead_strip项是删除多余的库符号
    -all_load让链接器把所有找到的目标文件都加载到可执行文件中
    -force_load所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径


    2016.03.03更新
    如果如果Other link flags中有-all_load项,不可贸然删掉,可以采取第一种方法,删除相同的 .o文件。

    参考

    相关文章

      网友评论

      • 自负的大撸sir:大神!问下: AFN里的是AFURLRequestSerialization.o, 第三方库引用的是KSAFURLRequestSerialization.o, 只是加了个前缀, 也提示.o文件冲突. 根据你的描述把冲突文件从第三方库中删除 编译以后又报错说:symbol(s) not found for architecture arm64 这是咋回事儿...
        b0661d9f1b61:@自负的大撸sir 没有,弃用这个冲突的三方库了
        自负的大撸sir:@xiu_yun 还没解决, 你呢
        b0661d9f1b61:@自负的大撸sir 我也有这个问题,你解决了吗
      • Mr_FF:.a可以这么处理,但是如果是.framwork怎么办呢?
        寥寥十一:请问两个冲突的.o名字不同怎么办呀?
        7分醉:Framwork拆开后也是.a
      • Mr_FF:拆包x86_64,重新打包的时候出现这个错误:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: object: libx-x86_64.a(x86_abi_support.o) malformed object (string table at offset 0 with a size of 8, overlaps Mach-O headers at offset 0 with a size of 144)
        请问怎么解决呢,armv7,arm64都没问题
        Mr_FF:@7分醉 不是,放弃x86了,几乎不用模拟器跑项目
        7分醉:@Mr_FF 误删x86_abi_support.o这个了吧?
      • 超_iOS:能帮忙看看么?
        Undefined symbols for architecture armv7:
        "l_OBJC_PROTOCOL_$_TencentApiInterfaceDelegate", referenced from:
        l_OBJC_$_PROTOCOL_REFS_TencentSessionDelegate in IMALoginViewController.o
        ld: symbol(s) not found for architecture armv7
        clang: error: linker command failed with exit code 1 (use -v to see invocation)
      • 蚂蚁牙齿不黑:大神 如何找到冲突的 .o 文件呢?
        7分醉:当你在使用时如果有冲突就会报错啊,错误信息里面就有冲突的文件名

      本文标题:iOS项目中引用多个第三方库引发冲突的解决方法

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