小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
通过问题看本质!!!
framework
framework即是静态库,又是动态库,framework只是打包的方式,mach-o的类型,决定了是否是动态库。
- .framework = .a + .h + 资源文件
- .a不能单独使用,必须要配合.h文件
- .framework 可以单独使用
库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。
静态库和动态库
| 静态库 | 动态库 | |
|---|---|---|
| 文件格式 | .a、.framework.framework = .a + .h + 资源文件.a不能单独使用,必须要配合.h文件.framework 可以单独使用 | .dylib、.framework |
| 转换 | 可以生成动态库 | 最终产物 |
| 描述 | .o文件的合集,没有经过链接。 | 把所有的.o文件链接在一起,生成一个动态库,编译链接最终的产物。 |
| 发生阶段 | 编译时,在链接阶段,链接到目标代码中,运行的时候不需要静态库。静态库的.o符号表和app的.o符号表会打包在一起。链接器ld链接静态库的时候,默认只会链接用到的代码。 | 运行时动态加载 |
| 外部依赖 | 不需要外部函数支持,程序可以单独运行 | 使用动态库必须依赖外部环境。如果环境缺少库或者库的版本不正确,会导致程序无法运行。 |
| 命名空间 | 没有,符号冲突是在编译阶段报错的通过符号表找符号 | 有二级命名空间找到动态库,再找符号 |
| 优点 | 1、模块化、分工合作、提高代码的复用、核心代码的保密2、避免少量的改动,导致重复编译 | 1、分模块、团队合作、(系统动态库将可执行文件体积缩小)2、在不重新编译链接可执行文件的前提下,更新动态库文件达到热更新的效果(系统)3、系统的动态库,多个应用程序共享同一份库文件、节省资源4、应用插件化 |