美文网首页
如何将第三方静态库封装进动态库

如何将第三方静态库封装进动态库

作者: frog78 | 来源:发表于2020-09-30 14:17 被阅读0次

随着动态库的流行,静态库越来越少了(关于动态库和静态库的介绍请点击),但是不排除项目中有些依赖的第三方还是使用的静态库。那么这种情况下就可以考虑,将第三方静态库做一个二次封装。一来和业务代码进行隔离,方便以后第三方库的升级,二来将静态库封装进动态库里便于管理和利用动态库的优势。一般情况下,用动态库封装静态库很简单,就是将静态库直接拖进动态库的工程里,直接编译即可。但是有一种情况下这么做是不行的,需要暴露静态库的头文件,也就是虽然静态库放在动态库里面了,但是静态库的头文件还要提供给上层应用调用。
下面以封装百度地图为例,介绍如何将第三方静态库封装进动态库。
百度地图根据业务不同,划分了很多不同的包,大概包括基础包、定位包、地图包、搜索包、工具包、全景包等。如下图所示:

百度地图包 这些包虽然是以.framework为后缀,但是都是静态库。
首先,新建一个动态库工程,直接将这些包拖入到工程中。 集成百度地图包 但是这时没有办法在BaiduMapKit.h中对外暴露头文件,因为百度地图的头文件都在.framework里面。如果不暴露头文件,也就意味着应用层无法调用。
BaiduMapKit.h文件 遇到这种情况,解决思路有三种。

第一种,用代码将百度地图库封装一层。

也就是自己代码调用百度地图库,然后将自己代码对外暴露,供应用层调用。这是最好的一种思路,不仅能解决问题,还能将第三方库和自己的项目业务隔离去耦合。对于一般的库(比较小的库),非常推荐这种思路。但是对于百度地图来说,不好执行,因为百度地图的API太多太复杂了,如果一点一点去封装,工作量太大了。当然有人说,不一定要将所有的API都重新封装,用到哪些才封装哪些,这样当然是可以的。不过还是挺困难的,百度地图里面定义的类型太多了,哪怕是只用地图这一个功能的API,工作量都挺大。 第一种思路

第二种,将百度地图的.framework包拆开为.a和.h文件。

上面提到,在.framework里面的头文件没办法对外暴露,那么把.framework这层壳去掉呢?

.framework本质上只是一个文件夹,而静态库.framework文件夹里面其实是.a文件和其头文件.h,把.framework文件夹去掉之后,就可以把里面的.h头文件暴露出去了。一般的库这么做是可以的,也比较方便,但对于百度地图来说,是不行的。原因很简单,百度地图各个包之间有依赖关系,即各包之间存在引用关系。去掉.framework文件夹和不去掉,引用方式是不一样的。.framework文件夹引用方式是使用尖括号import <xxx/xxx.h>,去掉之后引用方式就变成了普通文件的引用import "xxx.h"。百度地图各包之间的引用肯定是import <xxx/xxx.h>,如果去掉.framework文件夹,引用方式变了,也就导致文件找不到,编译不成功。 .framework拆包

第三种,为百度地图的.framework包额外添加.h头文件。

上面讨论了,对.framework拆包这种方式不适用于百度地图,所以还得想其他办法。比如,.framework包不动,然后在.framework包外再额外加一份头文件呢?事实证明,这样完全是可以的。 额外增加头文件

最终就是以这种方式解决问题。方法虽然很简单,但是需要想法。所以思路和想法非常重要。最终封装的形式如下图所示,demo请点击

最终方案

相关文章

网友评论

      本文标题:如何将第三方静态库封装进动态库

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