项目中碰到一个问题,微信支付需要设置Other Linker Flags为ObjC、all_load,但是由于各种需求,需要在原本项目中导入并集成直播,至于为啥选中腾讯云互动直播我就不懂了,嘿嘿 毕竟这个还不是我一个小菜鸟能决定的。跑题了,腾讯云互动直播的工程配置设置Other Linker Flags只能设置为ObjC,好吧冲突来了,百度各种找找到了苦主force_load。网上各种都是force_load带上静态库的路径,但是都是报错:
clang: error: unknown argument: '-force_load/Users/wbx/Desktop/wbxUser_3.0.1 2/wbx_user/OpenSDK1.7.7/libWeChatSDK.a'
解决方式:
看图-force_load后面带上路径没错,但是写法要注意,具体的看上图。
问题解决了,下面顺带再重温一遍ObjC、all_load、force_load。
对Other Linker Flags理解
在Other Linker Flags上设置flag用于创建一个用于静态库的链接器,在OC中并不是对每一个函数或者方法建立符号表,而只是对每一个类创建了符号表。如果一个类有了分类,那么链接器就不会将核心与分类之间的代码完成进行合并,这就阻止了在最终的应用程序中的可执行文件缺失了分类的代码,这样函数调用失败了。
ObjC
ObjC是Other Linker Flags中的一个flag,用于把静态库中定义的OC与category都加载进来。编译后App会变大,因为加载了很多不必要的文件而导致可执行文件变大。如果静态库中有类和category的话需要加入ObjC这个flag才行,但是ObjC也不是万能的,当静态库中只有分类而没有类的时候,ObjC就失效了,这就需要使用-all_load或者-force_load。
-all_load
-all_load会强制链接器把目标文件都加载进来,即使没有OC代码。但是这个参数也有一个弊端,那就是你使用了不止一个静态库文件的时候,你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,解决办法有两个:1、用命令行拆包;2:使用-force_load
-force_load
这个flag所做的事情跟-all_load其实是一样的,只是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。(加入的方式看文章一开始的截图)
总的就说这些吧,顺便把我参考的一个很赞的帖子附上要看帖子点这里。如果有问题,可留言。