iOS制作静态包duplicate symbol解决办法

原文链接 http://stackoverflow.com/questions/41217839/duplicate-symbols-when-integrating-firebase-and-google-sign-in-sdks-manually-wit

shell 语法参考:http://blog.csdn.net/zilong00007/article/details/6681090

制作静态包时我们很可能会引入第三方的库,这种时候很容易出现我们的静态包和主工程引入的第三方库有相同库的情况,为了解决这个问题上面链接给出了解决方案。

1、先制作一个静态包。

2、使用 lipo -info 查看这个静态包是不是fat file,如果是fat file就把它拆开成 x86_64.a,i386.a 这种多个机型的包(lipo -thin armv7 staticlibrary -output armv7.a)

3、在我们得到的某个 文件不是fat file时 执行 ar -x i386.a 这个命令可以将这个静态库拆成多个.o文件,每个.o文件就是 我们工程中对所有.m文件的编译后的output。这时候选中我们引用的第三方库的.o文件全部删除。然后剩下的就是我们的代码了

4、将我们自己的所有.o文件再合在一起生成一个新的.a文件:libtool -static  *.o -o i386_new.a 这种形式

5 、 运用上面的方法将所有上面生成的 arm_64.a,i386.a,x86_64.a都生成一份 *_new.a这种文件

6、重新合成:lipo -create arm_64_new.a i386_new.a -output xx.a

7、合成的xx.a就是我们要的剔除了第三方库的最终静态包,添加到你的主工程,如果是装了pod的话,把 other linker flag 的-framework删除然后pod update 

->Xcode run(注意以上lipo 的输出参数是-output, libtool的输出参数是-o)

由于以上步骤有点多,鉴于此我写了一个shell(https://github.com/zLihuan/ios_static_lib_repacking),希望有用:

使用方法:

1、打开bash终端 sh repackage.sh

2、往终端拖入静态包

3、输入你重新打包的框架(可以根据提示来copy 相应的值)

4、输入你要剔除的第三方框架的通配符 如MJRefresh 和Masonry 不通的通配符之间用空格分开: *MJ*.o *MAS*.o

5、创建一个文件夹(用于存放你的新生成的静态包) ,第四部完成后会提示你往终端拖入一个文件夹,你就往这里面拖入刚才创建的文件夹就好了。

6、打开你刚才创建的文件夹此时会有一个lib_customForRename_new.a 的静态库就是我们最终剔除了第三方类库的静态包了

 当然如果你没有输入第三方通配符的话,这个shell也可以作为一个生成制定包含某些手机架构的静态包

7*:如果你认为以上都不适用于你,那么你可以在我的贴出来的github地址上下载懒人版的脚本,只需编辑2行代码即可实现2部走,即可帮助你实现sdk打包时剔除第三方library的麻烦(https://github.com/zLihuan/ios_static_lib_repacking/blob/master/repackage_lazy.sh)

posted on 2017-04-25 19:32  码农时刻  阅读(253)  评论(0编辑  收藏  举报