反馈请联系hertz@hertzwang.com,谢谢
问题
ibmtasdk.a
和libWeChatSDK.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.a
中MTASocket.o
(失败)
步骤:
- 查看
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平台 - 获取各架构的动态库
$ lipo -extract_family i386 -o libmtasdk_i386.a libmtasdk.a
其它架构类型也是,最后得到libmtasdk_i386.a、libmtasdk_x86_64.a、libmtasdk_arm64.a、…… - 删除重复的
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
继续操作 - 合并所有架构类型的静态库
$ lipo -create -output libmtasdk_xxx.a libmtasdk_i386.a libmtasdk_x86_64.a libmtasdk_arm64.a armv7.a armv7s.a
- 使用新的静态库
libmtasdk_xxx.a
工程中删除libmtasdk.a
并导入libmtasdk_xxx.a
结束失败了,运行时报错
方案二:删除 libWeChatSDK.a
中MTASocket.o
(失败)
操作和结束同方案一
方案三:合并libmtasdk.a
和 libWeChatSDK.a
(失败)
步骤:
获取各架构的动态库
详细操作参考方案一建立不所需的文件夹
- libmtasdk
- i386
- x86_64
- arm64
- armv7
- libWeChatSDK
- i386
- x86_64
- arm64
- armv7
- libmtasdk
解压各架构的静态库
$ ar -d libmtasdk_i386.a
两个静态库的所有架构都需要解压将相同架构的文件夹合并
生成各架构的静态
$ libtool -static -o i386.a *.o
生成新的静态库
lipo -create -output libWeChatSDK_xxx.a i386.a x86_64.aarm64.a armv7.a
使用新的静态库
libWeChatSDK_xxx.a
工程中删除libmtasdk.a
和libWeChatSDK.a
并导入libWeChatSDK_xxx.a
结束失败了,运行时报错
方案四:升级 libWeChatSDK (成功)
在WeChatSDK官网上看到在1.8.6.1移除了MTA库,从而决定升级WeChatSDK
SDK1.8.6.1
- UIWebview切换成WKWebview
- 支持Universal Link拉起微信以及返回App
- 移除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