静态库

静态库:是一个外部函数与变量的集合体。
静态库的文件内容,通常包含一堆我们自定的变量与函数,内容不详动态链接库那么复杂,在编译期间由编译器和链接器将它集成到应用程序内,并制作成目标文件以及可以独立运行的可执行文件,这个可执行文件与编译可执行的程序,都是一种程序的静态创建。

与动态链接库比较

优点:

  只需保证在开发者的计算机有正确的库文件,在以二进制发布时不需考虑在用户的计算机上库文件是否存在和版本问题,可避免DLL地狱(在 mw 系统中,因为 DLL 的版本或兼容性问题造成程序无法运行)等问题

缺点:

  生成的可执行文件体积较大。正是为了避免此问题,才开发了动态库技术。   

动态链接库

是微软公司在微软视窗操作系统中实现共享函数库概念的一种实作方式。
动态链接,就是把一些经常会共用的代码(静态链接的 obj 程序库)制成 DLL 档,当可执行文件调用到 DLL 档内的函数时,Windows 操作系统会把 DLL 档加载到内存中,DLL 档本身就是可执行文件,当程序需求函数才进行链接。通过动态链接方式,可以降低内存浪费的发生。静态链接则是直接链接到可执行文件。

以上摘抄自某wiki

iOS 里的静态库和动态库

之前被问到静态库和动态库什么区别。。
库分为开源库和闭源库,闭源库又分为静态库和动态库。但是由于 AppStore 的限制,上架应用只能使用苹果提供的动态链接库,第三方库只能做成静态库。

.a 文件肯定是静态库,.dylib 肯定是动态库,.framework 都有可能
静态库在链接时,完整地被拷贝到可执行文件中,多个 app 如果使用同一个静态库,每个 app 都会拷贝一份;动态库在程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约内存。

编译过程和链接过程要区分开,静态库只在静态链接过程中起作用;静态库是 target object 文件的 archive 结构,链接时会将一些东西合并生成最终可执行文件的 Mach-O 结构

大范围使用动态库会拖慢启动时间,动态链接器需要在程序加载时去执行链接过程,也就是说把静态链接做的事情放到运行时做;系统的 SDK 可以共享内存的方式减少向虚拟内存映射的,但是符号链接的过程不会少。

创建静态库

1.a

创建Cocoa Touch Static Library

2.framework

创建Cocoa Touch Framework,然后Mach-O Type 选择 Static Library,
模拟器架构 iPhone4s ~ 5: i386 iPhone5s ~ 7Plus: x86_64 真机架构 3GS ~ 4s: armv7 5/5c: armv7s(armv7兼容 armv7s) 5s ~ 6sPlus: arm64
当我们用 iPhone5s 以上的模拟器打包的静态库架构是 x86_64,如果运行在 iPhone5及以下的模拟器,会报Undefined symbols for architecture i386
让静态库支持所有模拟器对应的架构
Build Setting->Build Active Architecture Only(只构建当前选中的模拟器或者真机的架构)–>No

模拟器版本的静态库和真机版是不能通用的,
使用命令行可以合并静态库
lipo -create xxx1.a xxx2.a -output xxx3.a
lipo -info xxx.a 可以查看 xxx.a 支持的架构