iOS中的SDK开发

作者: 测试账号 | 来源:发表于2021-06-24 23:55 被阅读0次

开发中,有一种开发叫SDK开发,window中的.dll文件,c++语言开发MFC插件,安卓开发的so库或者arr包,iOS的一般是静态库或者动态库,一般是.a文件或者framework文件。这几年,我基本就是做framework工作的。

问题起因:最近遇到了些麻烦,基本问题就是,需要把相同的底层c函数,分别打进两个不通的framework里面,但是问题就在这,编译时,会报文件或者函数冲突!然后开始了一番探索!

问题原因:各种平台基本都有一种叫做命名空间的结构,但是使用Object-C里面没有这个东西,(尽管Swift里面也有,但是奈何流程代码是OC写的,而且底层是C的函数冲突,具体用Swift去写的话,会不会冲突,可能需要去试试了)然后我就思考了下,为什么都被打成库里面的文件,还被不同OC包了一层的C函数,还是会被找出来,出现命名冲突问题呢?

前期猜想:可能和iOS的编译机制有关吧,因为都知道OC的底层就是用C语言实现的,或者说,有没有可能是苹果为了提高代码运行的效率,在编译阶段,苹果会遍历并拿出项目中的各种函数,然后统一放在一起,这样的话,当运行时调用的时候,会快速找出方法进行调用,这样省去了查找的时间,而且这样的话,也可以解释通,为什么我不同包里面的函数,会发生冲突呢?

探索发现:为了印证下自己的猜想,就开始了面向百度编程,然后发现了一个相对较为专业的说明(不过时间比较久了,可能也跟OC越来越少人用有关)。

因为我们在源码中写的全局变量名函数名类名在生成的*.o对象文件中都叫做符号,存在一个叫做符号表的地方。(这个符号表就对应了我猜想的那个公共的地方)


总结:这样来看的话,可能就可以这样总结下,iOS库的打包,本质就是,把源代码通过编译器编译成机器语言或者说汇编语言,就是.o文件,这个文件里面就有个叫符号表的东西,里面存着所有类名,而当两个包相遇的时候,进行编译,就会出现两个符号表合并的情况,这样就会出现重复命名的问题了,编译器就报错了!

看来解决的办法只能进行其中一个改名字(至于有的人说的加static,这样就没办法被外部调用,每一个函数的存在就是被外部使用的,要不它存在的价值是什么呢,有些不需要暴露的函数,直接再.c或者.m里面写就好了,也不会有问题,也不用暴露,也不用加Static!)

相关文章

网友评论

    本文标题:iOS中的SDK开发

    本文链接:https://www.haomeiwen.com/subject/xdqnyltx.html