事情是这样的, 项目里已经有百度SDK了, 又需要接入海康威视的某一个版本SDK。然后海康引用的静态库和百度SDK的静态库冲突了, 如下图:
遇到ld: duplicate symbol错误,就是因为不同的库文件里面有相同的目标文件引起的, 这里会有两种方法解决 1 :用命令行就行拆包再封包. 2 :就是改变other linker flags参数
一、拆包
-
打开终端, cd到libVMSNetSDK.a所在的文件夹(cd 打开项目直接把所在的文件夹拖拽到终端回车即可), 然后再输入lipo -info libVMSNetSDK.a查看库架构信息:
- 从图3 the fat file中可以看出, 库文件可以拆为2个子文件, 输入:
lipo libVMSNetSDK.a -thin armv7 -output libVMSNetSDK.armv7
lipo libVMSNetSDK.a -thin arm64 -output libVMSNetSDK.arm64
生成2个子文件备用。 - 接下来分别查看这2个子文件重复的.o文件, 比如libVMSNetSDK.armv7中, 输入
ar -t 文件夹/libVMSNetSDK.armv7
可以看到libVMSNetSDK.armv7中的所有.o文件(图4只显示了部分.o文件), 查看这些文件名,和Xcode编译报错时的显示文件名作对比, 找出重复报错的文件记录待用。
- 使用-d命令删除这些重复了的.o文件, 比如输入
ar -d -sv libVMSNetSDK.armv7 GDataXMLNode.o
就删除了, 接着把之前拆开的另外1个子文件查找重复、删除。
-最后就是合并文件了, 把处理好的2个子文件使用命令
lipo -create -output libVMSNetSDK.a libVMSNetSDK.armv7 libVMSNetSDK.arm64
进行合并, 就合成新的libVMSNetSDK.a静态库了
二、改变other linker flags
待验证......