由于一個項目既要做視頻通話又要做直播,七牛的播放庫PLPlayerKit和環信sdk都包含有ffmpeg的庫所以項目編譯時沖突報錯,最好方法就是放棄PLPlayerKit,然而我想說的是什么ijkPlayer,vitamio幾乎github上比較完善的播放sdk都是基于ffmpeg的,所以遇到和我一樣情況的別亂折騰,除了ffmpeg只有蘋果的AVPlayer了,而后者只支持HLS直播流,好吧我用AVPlayer封裝了一個界面簡單功能o更簡單的播放器算是保證了項目及時上線,但是作為碼農應該能用sdk堅決不自己寫,那么只有修改第三方sdk的靜態庫把沖突文件給踢掉于是
解決思路就是將其中一個.a庫里面起沖突的ffmpeg的庫刪除掉
方法:
開工前先打開終端cd到所要修改的.a庫所在文件目錄(最好備份出來到專門的目錄)
1.查看靜態庫文件包含的架構
查看.a庫文件所包含的架構庫命令:
lipo -info XXXXX.a
看看有什么架構的編譯庫
比如:
lipo -info libPLPlayerKit.a
可以看到輸出的結果:即包含armv7 armv7s i386 x86_64這幾個.a庫(可以發現libPLPlayerKit.a
其實是包含這幾個.a庫的fat文件,對于編譯庫和鏈接非科班出身可以看<<程序員的自我修養>>這本書),所以起沖突的.o不能從fat文件里面直接刪除,必須從每個架構的庫里面相應刪除
Architectures in the fat file: libPLPlayerKit.a are: armv7 armv7s i386 x86_64 arm64
2.接下來就是從fat文件里面分離出各個架構的庫
分離各個架構庫的命令(output的文件名可以自己定義):lipo -thin armv7 XXXXX.a -output XXXXX-armv7.a
比如:
lipo -thin arm64 libPLPlayerKit.a -output arm64.a
可以看到目錄下面已分離出arm64的庫文件arm64.a,同理其他什么armv7 armv7s i386 x86_64 都這么做
3.從每個架構的.a文件中刪除與其他sdk引起沖突的.o文件比如本例的ffmpeg
刪除.o文件的命令:ar -d -sv XXXXX-armv7.a XXXX.o
比如從arm64.a剔除沖突文件mpeg4audio.o:
ar -d -sv arm64.a mpeg4audio.o
當然本例發現起沖突的文件有幾百個,可以寫段程序獲取起沖突的文件名然后用ar命令把所有沖突的文件刪除掉
4.然后用lipo命令把已經剔除沖突的.a文件重新生成fat文件
和并靜態庫的命令:
lipo -create XXXXX-armv7.a XXXXX-armv7s.a (加上所有架構的編譯庫) -output XXXXX-NOFfmpeg.a
比如:
lipo -create armv7.a armv7s.a i386.a x86_64.a arm64.a -output libPLPlayerKit.a
最后發現已經生成新的靜態庫文件,替換掉原來的,然后運行發現沖突解決.
5.補充一
第4步剔除沖突文件時候如果為了以防有漏掉的文件,可以進一步解壓出每個架構的.a文件來看看是否沖突文件還在,然后再用lipo命令打包
查看.a所包含的.o文件命令:
ar -t XXXXX-armv7.a
6.補充二
有時候遇到沖突文件特別多比如本例,或者有三個四個sdk的靜態庫互相沖突,那尋找沖突文件會比較麻煩,還可以用另外思路,就是把多個sdk的靜態庫都解包,并且把每個sdk解包后的對應架構的.a文件解壓成.o文件,然后合并成一個靜態庫
解包命令如:
ar -x arm64.a
注意把每個架構的.a文件單獨放一個文件夾進行解壓命令,因為同一個sdk的不同架構庫解壓出來的.o文件同名會覆蓋掉
最后把兩個sdk的各個架構的.o文件按架構合并覆蓋掉重復的(即沖突的),然后打包成.a文件
目錄下所有.o文件(用*.o)打包成.a文件,命令:
ar -r *.o libxxx.a
最后再同上第4步用lipo命令把對應架構的.a文件合并成fat版的最終靜態庫導入項目
7.補充三
或許我寫的不清楚,可以用man lipo 或者 man ar 命令像個男人一樣質問一下lipo 和ar 的使用方法 O(∩_∩)O哈哈~