在对接微信三方登陆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后可用