0%

Duplicate symbol for .a

反馈请联系hertz@hertzwang.com,谢谢

问题

ibmtasdk.alibWeChatSDK.a 中都包含 MTASocket.o,从而出现重复的法名_responseErrorKey导致编辑失败
Log:
duplicate symbol ‘_responseErrorKey’ in:
TXUGCVideoUpload/COSSDK/libmtasdk.a(MTASocket.o)
UnifyPay/WeChat/libWeChatSDK.a(MTASocket.o)
ld: 1 duplicate symbol for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

解决方案

方案一:删除 libmtasdk.aMTASocket.o(失败)

步骤:

  1. 查看libmtasdk.a支持的架构类型
    $ lipo -info libmtasdk.a
    信息Architectures in the fat file: libmtasdk.a are: i386 x86_64 arm64 armv7 armv7s,表示该静态库支持i386、x86_64rm64、armv7、armv7s平台
  2. 获取各架构的动态库
    $ lipo -extract_family i386 -o libmtasdk_i386.a libmtasdk.a
    其它架构类型也是,最后得到libmtasdk_i386.a、libmtasdk_x86_64.a、libmtasdk_arm64.a、……
  3. 删除重复的MTASocket.o
    $ ar -d libmtasdk_i386.a MTASocket.o
    其它架构类型也是

    如果报错

     ar: libmtasdk_armv7.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
    

    ar: libmtasdk_armv7.a: Inappropriate file type or format
    则需要执行$ lipo libmtasdk_armv7.a -thin armv7 -o libmtasdk_armv7_new.a,然后使用libmtasdk_armv7_new.a继续操作

  4. 合并所有架构类型的静态库
    $ lipo -create -output libmtasdk_xxx.a libmtasdk_i386.a libmtasdk_x86_64.a libmtasdk_arm64.a armv7.a armv7s.a
  5. 使用新的静态库libmtasdk_xxx.a
    工程中删除libmtasdk.a并导入libmtasdk_xxx.a

结束失败了,运行时报错

方案二:删除 libWeChatSDK.aMTASocket.o(失败)

操作和结束同方案一

方案三:合并libmtasdk.alibWeChatSDK.a(失败)

步骤:

  1. 获取各架构的动态库
    详细操作参考方案一

  2. 建立不所需的文件夹

    • libmtasdk
      • i386
      • x86_64
      • arm64
      • armv7
    • libWeChatSDK
      • i386
      • x86_64
      • arm64
      • armv7
  3. 解压各架构的静态库
    $ ar -d libmtasdk_i386.a
    两个静态库的所有架构都需要解压

  4. 将相同架构的文件夹合并

  5. 生成各架构的静态
    $ libtool -static -o i386.a *.o

  6. 生成新的静态库
    lipo -create -output libWeChatSDK_xxx.a i386.a x86_64.aarm64.a armv7.a

  7. 使用新的静态库libWeChatSDK_xxx.a
    工程中删除libmtasdk.alibWeChatSDK.a并导入libWeChatSDK_xxx.a

结束失败了,运行时报错

方案四:升级 libWeChatSDK (成功)

在WeChatSDK官网上看到在1.8.6.1移除了MTA库,从而决定升级WeChatSDK
SDK1.8.6.1

  1. UIWebview切换成WKWebview
  2. 支持Universal Link拉起微信以及返回App
  3. 移除MTA库

升级完后的 WeChatSDK 遇到错误信息, 按照方案一成功解决掉了

duplicate symbol ‘OBJC_CLASS$_WXWebViewController’ in:
UnifyPay/WeChat/libWeChatSDK.a(WapAuthHandler.o)
H5Pay/libH5Pay.a(WXWebViewController.o)
duplicate symbol ‘OBJC_METACLASS$_WXWebViewController’ in:
UnifyPay/WeChat/libWeChatSDK.a(WapAuthHandler.o)
H5Pay/libH5Pay.a(WXWebViewController.o)
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

其它

命令总结

  • $ lipo -info XXX.a,查看静态库支持 架构类型
  • $ lipo -extract_family i386 -o i386.a XXX.a,获取 i386架构 的静态库
  • $ lipo XXX_armv7.a -thin armv7 -o armv7.a,转换 armv7架构 静态库的 file类型 ,解决is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
  • $ lipo -create -o libXXX_xxx.a libXXX_i386.a libXXX_x86_64.a libXXX_arm64.a libXXX_armv7.a,合并 i386架构x86_64架构arm64架构armv7架构 静态库
  • $ ar -d libXXX_arm64.a 1.o 2.o 3.o,移除静态库中的.o
  • $ ar -x libXXX_arm64.a,解压静态库至当前文件夹
  • $ libtool -static -o libXXX_arm64.a *.o,生成静态库

方案一完整Log

    localhost:hertz$ lipo -info libmtasdk.a 
    
    Architectures in the fat file: libmtasdk.a are: i386 x86_64 arm64 armv7 armv7s 
    
    localhost:hertz$ lipo -extract_family i386 -output i386.a libmtasdk.a 
    
    localhost:hertz$ lipo -extract_family x86_64 -output x86_64.a libmtasdk.a 
    
    localhost:hertz$ lipo -extract_family arm64 -output arm64.a libmtasdk.a 
    
    localhost:hertz$ lipo -extract_family armv7 -output armv7.a libmtasdk.a 
    
    localhost:hertz$ lipo -extract_family armv7s -output armv7s.a libmtasdk.a 
    
    localhost:hertz$ ar -d i386.a MTASocket.o
    
    ar: MTASocket.o: not found in archive
    
    localhost:hertz$ ar -d x86_64.a MTASocket.o
    
    ar: MTASocket.o: not found in archive
    
    localhost:hertz$ ar -d arm64.a MTASocket.o
    
    localhost:hertz$ ar -d armv7.a MTASocket.o
    
    ar: armv7.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
    
    ar: armv7.a: Inappropriate file type or format
    
    localhost:hertz$ lipo armv7.a -thin armv7 -output new_armv7.a
    
    localhost:hertz$ ar -d new_armv7.a MTASocket.o
    
    localhost:hertz$ ar -d armv7s.a MTASocket.o
    
    ar: armv7s.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
    
    ar: armv7s.a: Inappropriate file type or format
    
    localhost:hertz$ lipo armv7s.a -thin armv7s -output new_armv7s.a
    
    localhost:hertz$ ar -d new_armv7s.a MTASocket.o

    localhost:hertz$ lipo -create -output new_library.a i386.a x86_64.a arm64.a new_armv7.a new_armv7s.a