制作传统动态库和静态库遇到的问题

简介: 制作传统动态库和静态库遇到的问题

之前整理过两种打包静态库的方法与使用:iOS制作.framework静态库、 iOS使用.framework类型的静态库和iOS制作.a类型的静态库、iOS使用.a类型的静态库。不过这种方式的缺点很明显,以我们要开发的SDK自定义库为例子:

  1. 需要自己使用Xcode创建静态库工程;
  2. 当SDK自定义库使用里第三方库,而使用SDK的工程也使用了相同的库,那么由于静态库实际上是拷贝两份代码,直接导致编译报错。你不可能要求用户不能使用那个你使用的第三方库,这个是不科学的。由于你的第三方库打包在包中,用户不导入第三方库,直接使用你的包中第三方库也会编译报错。
  3. 制作的静态库要发布4个版本:真机-Debug版本、真机-Release版本、模拟器-Debug版本、模拟器-Release版本。虽然可以Debug版本和Release版本两两合并,但是还是要生成两个静态库。
  4. 在开发过程中需要同时支持Debug版本和Release版本时,要导入两个包,并且只.a的静态库,支持同时导入两个合并的Debug版本和Release版本的包;.framework类型的静态库直接不支持同时导入两个包。
  5. 对静态库的使用测试另需要建立一个工程进行测试。

静态库与动态库的区别

静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。

动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。

静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

既然静态库存在那么多问题,并且动态库链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用。看似动态库比静态跟先进,那么我做了iOS制作动态库和iOS使用动态库。结果仍旧一大堆问题:

  1. 需要自己使用Xcode创建静态库工程;
  2. 当SDK自定义库使用里第三方库,而使用SDK的工程也使用了相同的库,那么由于动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在,链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次。那么经过测试,使用SDK的工程使用的是SDK中的第三方库,若两个版本不一致可能出现使用者找不到新的第三方库的函数问题。你不可能要求用户不能使用那个你使用的第三方库或使用的第三方版本一致,这个是不科学的。由于你的第三方库打包在包中,用户不导入第三方库,直接使用你的包中第三方库会编译报错。若把你SDK中的第三方库去掉,你连打包都不能打成功。
  3. SDK自定义库使用里第三方库’ReactiveCocoa’, ‘2.5’,而使用SDK的工程也使用了相同的库编译正常,使用正常。当SDK自定义库使用里第三方库’ReactiveCocoa’, '2.5’及其它十多个第三库,而使用SDK的工程也使用了相同的库编译不过,不包含这个库能正常运行。这个我解决了两天没有解决了。不知道和它使用了Runtime有关。
  4. 制作的动态库要发布4个版本:真机-Debug版本、真机-Release版本、模拟器-Debug版本、模拟器-Release版本。虽然可以Debug版本和Release版本两两合并,但是还是要生成两个动态库。
  5. 在开发过程中需要同时支持Debug版本和Release版本时,.framework类型的动态库直接不支持同时导入两个包。
  6. 对动态库的使用测试另需要建立一个工程进行测试。

藐视动态更接近了我们SDK开发的基本需求,至少可以SDK自定义库和使用SDK的工程同时使用相同的第三方库。但是存在的两个顽固问题无法接近:

1.当两者使用相同的库时,使用SDK的工程实际使用的是SDK的第三方库,当两者的版本不一致时可能出现由于版本不同编译不通过的问题;

2.当两者使用相同的’ReactiveCocoa’库时, 可能出现编译不通过问题。自己这一关都不通过怎么让别人放心用呢?


看似没有解决方案,但是为何我用别人的第三方库用的很欢呢?不是没有解决方案,而是我们没有知道解决方案。


因为公司需要持续性向别人提供一套蓝牙锁SDK,按照之前的方式打包静态库真是太痛苦,SDK依赖的一些私有库会有频繁的更新,依赖的第三方库也是错综复杂。我迫切需要找到一种更方便的打包静态库的方式,既能随时更新私有库,也能解决开源库的冲突问题(比如你的SDK包含了AFNetworking,别人项目中本身也含有AFNetworking,就会产生冲),那就是使用cocoapods。

打包使用package进行打包:

pod package ELock.podspec --force --no-mangle --spec-sources=http://192.168.1.16:5878/bitinfo_tech_ios/BitInfoTechSpec.git,https://github.com/CocoaPods/Specs.git

下面是解决这一系列问题的一篮子解决方案:

开发模式研究:

app四种开发模式的优缺点。移动五端合一说了如何让移动五端合一。

如何访问组件的bundle资源。

创建使用SDK静态库具体方案:

创建制作SDK的静态库工程说了如何创建工程,制作SDK静态库已经说了SDK如何写,打包SDK静态库说了如何打包iOS使用SDK静态库。

.framework类型的静态库和.a类型的静态库的优缺点及.framework类型的静态库zip压缩后解压后头文件丢失问题。


Mac电脑如何使用WinRAR。

下面是Demo:

iOS使用SDK静态库Demo.

SDK的Demo。


目录
相关文章
|
6月前
|
编译器 程序员 C语言
静态库与动态库的构建(含具体代码可以实操)
静态库与动态库的构建(含具体代码可以实操)
48 0
|
程序员 vr&ar C语言
C/C++静态库和动态库的制作、使用、优缺点
C/C++静态库和动态库的制作、使用、优缺点
215 0
|
Shell
静态库和动态库制作
静态库和动态库制作
55 0
|
Linux vr&ar C语言
Linux下静态库和动态库(共享库)的制作和使用
Linux下静态库和动态库(共享库)的制作和使用
143 0
|
程序员 C++
程序员技巧 —— vs 制作自己的静态库
程序员技巧 —— vs 制作自己的静态库
61 0
|
存储 Linux 编译器
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(一)
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库
275 0
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(一)
|
Linux Shell 编译器
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(二)
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库
389 0
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(二)
|
NoSQL 编译器 vr&ar
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
221 0
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
|
Linux
Linux环境混合使用静态库与动态库
Linux环境混合使用静态库与动态库
159 0
|
Linux
Linux环境封装静态库成动态库
Linux环境封装静态库成动态库
192 0