引用百度地图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引入工程中,在模拟器和真机上分别进行测试,都可经过编译。

总结

相关文章
相关标签/搜索