参考链接:http://www.cnblogs.com/Jenaral/p/5530383.html
关于静态库和动态库的区别。.a .dylib .tbd .framework有什么区别?
首先为什么会存在库?库是有一些接口头文件和编译好的二进制文件组成的,其存在一般有两个意义,一个是封装代码不给别人看,库在构建目标程序的时候,只需要执行link操作,不需要重新编译。
静态库:
静态库典型的有window下的.lib文件, unix系下的.a文件。静态库和动态库一个很重要的区别是,在编译时候发生的行为。静态库在编译的时候会复制一份到目标程序。动态库在编译的时候只存储指向动态库的引用。
动态库:
window下的dll文件,mac下的.dylib/.tbd文件。在编译的时候,动态库并不会被复制到目标程序。所以不会影响目标程序的大小。同一份动态库能够被多份程序使用。因为只存储对外的链接,使得程序运行时候的风险比较到,有时候会碰到lib not found的情况。
关于iOS下的framework:
前面讲了.a .ib.dylib .dll等库文件,那么我们经常在iOS中碰到的.framework是什么呢?framework其实是iOS/mac平台自有的一种格式,其对二进制库,头文件和资源进行了封装,便于分发和管理。在iOS 8 之前只有苹果本身支持的一些framework,比如uikit, nsfoundation等。苹果在iOS 8之前并不支持自己开发的framework.苹果这样做是基于安全考虑,因为动态链接库是不用包含进目标程序的,这给黑客从网络下载动态链接库并执行代码提供了漏洞。此时在iOS平台,动态库失去了其意义,开发者要共享代码的话只能通过.a文件。在iOS8 之后,出现了extension, 此时共享动态库就很有必要了,此时苹果开始支持开发自己的framework,此时自己构建的framework和系统的framework还是有区别的,系统的framework并不需要复制到目标程序。自己开发的framework无论是动态还是静态的,都要复制到目标程序,所以苹果又把这个叫做embeded framework,
Only iOS8+ will allow dynamic frameworks in the app bundle, however.
The way to find out is to look in the .framework
and use the file
command on the main file:
$ cd iOS/Crashlytics.framework
$ ls -l
total 9984
-rwxr-xr-x 1 andy staff 4710656 11 Sep 17:11 Crashlytics
drwxr-xr-x 8 andy staff 272 11 Sep 17:11 Headers
-rw-r--r-- 1 andy staff 1553 11 Sep 17:11 Info.plist
drwxr-xr-x 3 andy staff 102 11 Sep 17:11 Modules
-rwxr-xr-x 1 andy staff 146164 11 Sep 17:11 run
-rwxr-xr-x 1 andy staff 241688 11 Sep 17:11 submit
$ file Crashlytics
Crashlytics: Mach-O universal binary with 5 architectures
Crashlytics (for architecture armv7): current ar archive random library
Crashlytics (for architecture armv7s): current ar archive random library
Crashlytics (for architecture i386): current ar archive random library
Crashlytics (for architecture x86_64): current ar archive random library
Crashlytics (for architecture arm64): current ar archive random library
Where ar archive
means "static library".
$ cd /Library/Frameworks/iTunesLibrary.framework/
$ ls -l
total 40
lrwxr-xr-x 1 root wheel 24 10 Sep 17:38 Headers -> Versions/Current/Headers
lrwxr-xr-x 1 root wheel 24 10 Sep 17:38 Modules -> Versions/Current/Modules
lrwxr-xr-x 1 root wheel 26 10 Sep 17:38 Resources -> Versions/Current/Resources
drwxr-xr-x 4 root wheel 136 10 Sep 17:41 Versions
lrwxr-xr-x 1 root wheel 22 10 Sep 17:38 XPCServices -> Versions/A/XPCServices
lrwxr-xr-x 1 root wheel 30 10 Sep 17:38 iTunesLibrary -> Versions/Current/iTunesLibrary
$ file Versions/Current/iTunesLibrary
Versions/Current/iTunesLibrary: Mach-O universal binary with 2 architectures
Versions/Current/iTunesLibrary (for architecture i386): Mach-O dynamically linked shared library i386
Versions/Current/iTunesLibrary (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64