引用静态库或三方出现xx duplicate symbols for arc时hitecture arm64

事情是这样的, 项目里已经有百度SDK了, 又需要接入海康威视的某一个版本SDK。然后海康引用的静态库和百度SDK的静态库冲突了, 如下图:

引用静态库或三方出现xx duplicate symbols for arc时hitecture arm64_第1张图片
图1.png

引用静态库或三方出现xx duplicate symbols for arc时hitecture arm64_第2张图片
图2.png

遇到ld: duplicate symbol错误,就是因为不同的库文件里面有相同的目标文件引起的, 这里会有两种方法解决 1 :用命令行就行拆包再封包. 2 :就是改变other linker flags参数

一、拆包

  • 打开终端, cd到libVMSNetSDK.a所在的文件夹(cd 打开项目直接把所在的文件夹拖拽到终端回车即可), 然后再输入lipo -info libVMSNetSDK.a查看库架构信息:


    引用静态库或三方出现xx duplicate symbols for arc时hitecture arm64_第3张图片
    终端图3.png
  • 从图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
图4(.o文件部分截图).png

可以看到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
待验证......

你可能感兴趣的:(引用静态库或三方出现xx duplicate symbols for arc时hitecture arm64)