iOS 静态库转动态库
iOS 静态库转动态库的方法
问题
由于二级制 __TEXT 段 60M 的上限问题,支付宝钱包也将个别的 SDK 转换成动态库。
在实际抓换的过程中,由于源代码保密的问题,第三方只能提供二级制的静态库,不能提供源代码。因为我们只能把静态库直接转成动态库
抓换方法
转换方法是基于动态库本身编译和链接的特点:在链接时会把依赖的静态库 symbol 复制到本库
步骤示意图:(S1 表示静态库,D1 表示动态库)
举例说明:将不依赖其他的静态库的静态库 AMapFoundationKit.framework 转换成动态库 AMapFoundationKit.framework
步骤一
可以从Xcode原生的动态库模版一个空的动态库,与静态库名称相同,即AMapFoundationKit。
步骤二
####2.1
设置Framework搜索路径,在AMapFoundationKit -> Build Settings -> FRAMEWORK_SEARCH_PATHS设置成静态库的路径
2.2
将静态库拖到 AMapFoundationKit -> Build Phases -> Link Binary With Libraries
2.3
2.3 将静态库Headers中的所有头文件拖到 AMapFoundationKit -> Build Phases -> Headers -> Public,不用Copy文件。同时删除模版生成的AMapFoundationKit.h。

2.4
将静态库中的所有资源拖到AMapFoundationKit -> Build Phases -> Copy Bundle Resources

2.5
定义Link时load all symbols,将AMapFoundationKit -> Build Settings -> OTHER_LDFLAGS中添加-all_load

2.6
关闭Version System,AMapFoundationKit -> Build Settings -> VERSIONING_SYSTEM设置为None

2.7
创建触发编译的空文件(不用写任何函数),因为无编译文件将不会生成macho文件。

2.8
将静态库framework的所有系统库的依赖添加进来,可根据编译时symbol未找到symbol报错,依次添加到AMapFoundationKit -> Build Phases -> Link Binary With Libraries

步骤三
执行编译
步骤四
获取编译后的产物,即动态库AMapFoundationKit.framework
