最近在写公司的智能家居项目时碰到静态库冲突问题,我和公司另外一个同事折腾了几天终于弄出来了, 太坑人.......现在写篇简文记录一下。
一,报错现象
二,问题分析
1- duplicate symbol,重复的标识符
原因:我这里是两个静态库中都有GCDAsyncUdpSocket.o,一个项目里面不能包含类名一样的文件
2-命名冲突
原因一:在aes256.o和aes.o中都有名为 _aes_encrypt(加密)和_aes_decrypt(解密)的方法,这里方法名称冲突了。
原因二:可能会从这个静态库调到那个静态库 然后报linker错误
三,解决方案
- 可以试着把other Link flag 改成 -force_load /Users/jss/Desktop/测试代码/libKonkeSmartPlug.a 我这里用的绝对路径做的测试 你们自己改成相对路径就好了(这个意思是:各自的静态库加载各自的类不会出现从这个库调用到那个类的库)
运行再报错的话 那就只能用终端命名把静态库中相同的第三方库给删掉 然后再合并生成新的静态库
- 看步骤(终端命令)
注意: 做这个操作的时候,把静态库单独拷贝到一个新的文件夹进行测试
- cd /Users/jss/Desktop/测试静态库
- ls (查看目录下的文件)
- lipo -info EasyConfig.a(例如armv7,armv7s,i386等)
- lipo EasyConfig.a -thin armv7 -output lbv7.a (分别把armv7,armv7s等等都写一遍后面的.a 命名规范)
5)再 ls 查看 (可以看到刚刚分出来的几个.a) - lipo -info lb* (注意命名 我这里.a都是lb开头且都是四位)
- ar -d lb64.a GCDAsyncUdpSocket.o (armv7,armv7s等分别执行一遍 目的是删除)
- lipo -create lb64.a lb86.a lb38.a lb7s.a lbv7.a -output EasyConfig.a(重新合并 .a文件)
- cp EasyConfig.a /Users/jss/Desktop/测试代码 (拷贝到项目中覆盖源文件)
这里附上上面的终端操作的图片:
四,查看静态库包含哪些文件的命令如下:
- cd 文件路径
- lipo -info EasyConfig.a
- mkdir armv7 (用来存放armv7平台解压后的.0文件: 目的也是为了看到某一个平台里面所有的 .o 文件)
- lipo EasyConfig.a -thin armv7 -output lib.a (取出armv7 平台的包)
- ar -t lib.a (查看库中所包含的文件列表)
五,总结
1.以后打包静态库的同志不要再坑队友了,千万别把第三方公用库打在自己的包里