引用百度地圖framework引發的「duplicate symbol … in」的解決方案

問題描述:opencv2.framework與BaiduMapAPI_Base.framework中部分.o文件衝突,致使編譯不能經過架構

背景

某些通用處理庫被百度BaiduMapAPI_Base.framework和opencv2.framework 都引用進去 ,這樣致使的問題就是當接入百度地圖的app再次引入opencv.framework的時候,就會報duplicate symbol … in的錯誤。app

解決思路

  1. 對比BaiduMapAPI_Base.framework和opencv2.framework中的.o文件
  2. 把兩個framework中重複部分從opencv2.framework中「剔除」,而後再將處理後的opencv2.framework加入項目中去進行編譯

工具

  1. ar -- 查看framework中的相關文件
  2. lipo -- 刪除framework中「多餘」的.o文件以及從新合成新的framework包

步驟

  1. 在opencv2.framework所在的目錄下,利用下面兩個命令,進入opencv2.framework,查看它支持的CPU架構
cd opencv2.framework
lipo -info opencv2

執行完以後輸出以下:工具

Architectures in the fat file: opencv2 are: armv7 armv7s i386 x86_64 arm64

從CPU的架構能夠看出該framework同時支持真機和模擬器測試

2.  把每種架構對應的文件提取出來進行分析處理,首先以armv7架構爲例,運行下面命令解壓armv7架構下對應的文件spa

lipo opencv -thin armv7 -output cv.armv7

運行成功以後在當前路徑下生成一個cv.armv7文件,如今用ar命令來查看該文件中的.o文件.net

ar -t cv.armv7
world_init.o
algorithm.o
alloc.o
arithm.o
array.o
cmdparser.o
convert.o
copy.o
datastructs.o
drawing.o
dxt.o
gl_core_3_1.o
glob.o
gpumat.o
lapack.o
mathfuncs.o
matmul.o
matop.o
matrix.o
opengl_interop.o
opengl_interop_deprecated.o
out.o
parallel.o
persistence.o
rand.o
stat.o
system.o
tables.o
flann.o
miniflann.o
accum.o
approx.o
canny.o
clahe.o
color.o
contours.o
convhull.o
corner.o
cornersubpix.o
deriv.o
.......

一樣方法分析BaiduMapAPI_Base.framework, 發現重複的文件以下code

adler32.o
compress.o
crc32.o
deflate.o
inflate.o

執行刪除操做,依次刪除這五個文件blog

ar d cv.armv7 adler32.o
...

至此,armv7架構下的文件「清理」完畢!ip

3.  重複步驟2,將其餘CPU架構文件夾下的內容作相同操做。此步驟結束以後,會有cv.armv七、cv.armv7s、cv.arm6四、cv.i386和cv.x86_64五個刪除重複.o後的文件。rem

4. 運行下面命令合成新的opencv2包

lipo -create -output opencv2 cv.armv7  cv.armv7s cv.arm64 cv.i386 cv.x86_64

命令運行成功以後大功告成,此時將新的opencv2.framework引入工程中,在模擬器和真機上分別進行測試,都可經過編譯。

總結

相關文章
相關標籤/搜索