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
注意:如果静态库中使用了category,调用的时候肯定会出现如下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由于版本不一致导致的冲突问题。
2020年4月18日更新
静态库加载顺序
库加载是通过配置的顺序进行加载,当发现需要调用的接口都已经定义,则不在继续加载,所以如果两个库有重复定义的接口,可以通过先后顺序指定加载哪个。
后者加载的接口会覆盖前面库的接口。
静态库依赖其他静态库
若libb.a依赖liba.a,编译b的时候不需要链接a,只需要指定需要依赖的头文件路径即可。