在開發期間集成ZBar 和 支付 的時候,發現很多提示是.o文件沖突,最常見的時base64沖突,原因是由于不少第三方靜態庫中都有base64這個文件.
下面附上方法,打開console終端,找到要解剖的.a文件(可以先拷貝一份,我是拷貝一份放到桌面了),執行下列命令查看庫包含的cpu架構代碼:
?lipo -info libx.a
Architectures in the fat file: libx.a are: i386 armv7 armv7s //此處如果直接使用lipo命令看到的會是: i386 armv7 armv6
/Users/HELLO/Desktop/libcrypto.a?是文件路徑
bogon:~ HELLO$ lipo -info /Users/HELLO/Desktop/libcrypto.a
Architectures in the fat file: /Users/HELLO/Desktop/libcrypto.a are: armv7 armv7s i386 x86_64 arm64
然后用
xcrun -sdk iphoneos lipo -extract_family i386 -output libx-i386.a libx.a
xcrun -sdk iphoneos lipo -extract_family armv7 -output libx-inter.a libx.a
bogon:~ HELLO$? lipo -extract_family i386 -output /Users/HELLO/Desktop/libcrypto-i386.a /Users/HELLO/Desktop/libcrypto.a?
bogon:~ HELLO$? lipo -extract_family armv7 -output /Users/HELLO/Desktop/libcrypto-inter.a /Users/HELLO/Desktop/libcrypto.a
分離出arm版本的.a,這里有個小問題,按我的理解此命令應該對包含3種cpu代碼的.a里的armv6部分進行操作,而實際分離出來的.a卻是同時包 含armv7和armv7s的部分,也就是依然是”fat” lib,這樣是不能抽出.o的,因此還需要進行以下操作:
lipo libx-inter.a -thin armv7 -output libx-armv7.a
lipo libx-inter.a -thin armv7s -output libx-armv7s.a
bogon:~ HELLO$ lipo /Users/HELLO/Desktop/libcrypto-inter.a -thin armv7 -output /Users/HELLO/Desktop/libcrypto-armv7.a
bogon:~ HELLO$ lipo /Users/HELLO/Desktop/libcrypto-inter.a -thin armv7s -output /Users/HELLO/Desktop/libcrypto-armv7s.a?
這樣就能分離出2份不同版本arm的.a了,然后進行解.o操作:
ar -x libx-armv7.a
這部操作最好放到單獨的文件夾里進行
(/Users/HELLO/Desktop/armv7/)桌面上的文件armv7文件夾路徑
在文件夾里面進行操作本步驟
bogon:home HELLO$ cd /Users/HELLO/Desktop/armv7/?
bogon:armv7 HELLO$ ar -x /Users/HELLO/Desktop/armv7/libcrypto-armv7.a
,會將link出.a的所有.o還原出來,然后有兩種選擇:一是把所有庫對應cpu架構的部分都還原到這個位置,然后 將重復的部分合并為一份,接著用后面的命令將所有.o再合并為一份公共lib。還有一種選擇就是保留重復符號中的一份lib完好如初,將其余lib單獨解 開,剔出重復符號存在的.o,然后將該lib重新link回.a,以去除重復符號。
不管用哪種方法解決,最后的link回命令如下:
libtool -static -o ../libx-armv7.a *.o
bogon:armv7 HELLO$ libtool -static -o ../libcrypto-armv7.a *.o【.a 和?* 號之間有一個空格】
仍然在armv7文件夾里操作,會在armv7的上一級文件中重新生成.a文件(由于我的上一級目錄是桌面所以直接覆蓋了原先桌面的文件)
【我查了下這個”has no symbols”好像只是提示性質,不是錯誤提示】
當然,別忘了咱們的庫都是有多份cpu架構指令的,所以,先要對每種cpu arch的庫進行同樣操作,然后還要將thin lib合并回fat lib:
lipo -create -output libx.a libx-armv7.a libx-i386.a libx-armv7s.a
最后合并成一個.a文件替換工程里的.a文件就行了
這樣,再link回自己的app時就不會再出現duplicate symbol了。
文章來源:http://blog.csdn.net/jiangnanshuilu/article/details/44056939