iOS下的存在形式
静态库:.a和.framework 动态库:.dylib和.framework(系统提供给我们的framework都是动态库!)
苹果的态度
iOS 8 之前,iOS 平台不支持使用动态 Framework,开发者可以使用的Framework 只有苹果自家的 UIKit.Framework,Foundation.Framework 等。
WWDC2014(iOS8)以后,苹果允许开发者自行开发动态库。突然间转变态度,唯一的理由大概是App Extension的出现,它可以为一个应用创建插件,Extension 和 App 是两个分开的可执行文件,同时需要共享代码,这种情况下动态库的支持就是必不可少的了。
app动态更新
开放了动态库的使用权限之后,开发者可以自定义创建framework实现软件的动态更新(即绕过apple store审核,从服务器发布更新版本),不过含有自定义的framework的app是无法在商店上架的,故只能用于企业内部应用。
和库相关的几个命令
nm display name list (symbol table),其实就是把对象文件中的相关符号标识都列出来 otool otool,顾名思义就是object tool,比其nm来说,其功能更强大,可以查看对象文件的方方面面,比如展示对象文件的Mach Header,用到了哪些共享库(shared libraries),或者数据段内容等。 lipo create or operate on universal files,此命令主要是帮你查看或者创建支持多平台的静态库的。比如将两台不同平台的静态进行合并。
Xcode8制作framework及使用
http://blog.csdn.net/dp948080952/article/details/52749120
注意:如果静态库中使用了caategory,调用的时候肯定会出现如下unrecognized selector sent to class错误提示,这时要设置other linker flag,生成静态库和调用静态库的工程都加上-all_load。
2018年10月26日更新
.a不支持Swift(苹果的限制)
不能使用OC和Swift混编的方式实现静态库
因为想Swift调用OC需要<produceName-Bridging-Header.h>的桥接头文件,OC调用Swift需要produceName-swift.h桥接头文件,这两个文件都是隐藏的,无法暴露出来,因此也就不可能引用。
2019年11月14日更新
framework跟.a的区别
.a是多个目标文件.o的集合,它在生成的时候只需要所依赖静态库的头文件,不需要具体的实现,所以最终用的时候需要链接依赖的静态库,这可能会出现openssl由于版本不一致导致的冲突问题
framework是二进制代码,它所依赖的静态库会在生成framework的时候被链接进去,所以最终用的时候只需要framework,不再需要.a了,这可以用于解决openssl由于版本不一致导致的冲突问题