iOS开发中接入微信三方登录后报错duplicate symbols for architecture arm64 linker command failed with exit code 1

在对接微信三方登陆SDK时,在demo中没有任何问题,然而提供给游戏对接之后便出现了这个问题

duplicate symbols for architecture arm64   linker command failed with exit code 1

经验告诉我是libGCloundVoice.a和 libiphone-lib.a这两个库文件冲突问题,找遍整个工程也没见有重复问题。

后来终于在https://www.jianshu.com/p/28824037569d这篇文章中定位到是-all_load编译项惹的祸。

解决办法:删除-all_load编译项,但是微信第三方登录中的libWeChatSDK.a又需要使用到它,我们可以用-force_load+.a文件的路径来替换。

错误原因及内容:当我们在工程中用到一些三方SDK时,都会有.a或者.framework静态库,这时候如果直接编译运行就会报错(有时候没有用到里面的方法直接运行时不会报错,但一旦导入头文件使用时便会报错),像这种“_BIO_ctrl”,referenced from等一系类错误

这里报错原因是:xcode找不到静态库文件里面的类,所以需要在build setting的linker flags中添加-ObjC,-all_load等flag来告诉链接器把库里面的类都添加进来。或者是没有静态库文件拖入到工程中

other linker flages参数:

-ObjC:告诉链接器把库中定义的Objective-C类和category都加载进来。这样编译后APP会变大,因为加载了其他OC代码进来。但是如果静态库中有类和category的话只有加入这个flag才行。

-all_load:这个flag是专门处理-ObjC的一个bug的,用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来,变通方法就是加入-all_load或者-force-load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。

注意:假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件

-force_load 这个flag所做的事和-all_load其实是一样的,只有-force_load需要指定要进行加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载,-force_load在xcode3.2后可用

参考:https://blog.csdn.net/wsyx768/article/details/78557693

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值