静态库和动态库的区别
- .a文件肯定是静态库,.dylib肯定是动态库,.framework可能是静态库也可能是动态库;
- 静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的;
- 动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;
- 但是项目中如果使用了自己定义的动态库,苹果是不允许上架的,在iOS8.0以后苹果开放了动态加载.dylib的接口,用于挂载.dylib动态库
-
.a + .h
CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。模拟器上的架构和真机上的架构是不一样的,模拟器和模拟器之间,真机和真机之间的架构也是不同的。如果静态库的架构和测试项目对应的模拟器或真机上的架构不对应就会报“未定义的符号XXX架构”, 由此可以得出模拟器上的静态库!
模拟器架构
- iPhone4s ~ 5 : i386
- iPhone5s ~ 7Plus : x86_64
真机架构
- 3GS~4s : armv7
- 5/5c : armv7s(armv7兼容armv7s)
- 5s ~ 6sPlus : arm64
使用iPhone6s打包的静态库架构是:x86_64, 测试项目选择的是模拟器iPhone5对应的架构是:i386, 架构不匹配所以报Undefined symbols for architecture i386
input file libiFly.a is not a fat file:输入文件libiFly.a不是一个胖文件,胖文件是指只支持一个架构,不兼容其它架构。
让静态库支持所有模拟器对应的架构
静态库有4种版本:
- 调试版本:不会对代码进行优化
- 模拟器版本
- 真机版本
- 发布版本 :会对代码进行优化,执行效率相对调试版本快,但不会有明显的差别
- 模拟器版本
- 真机版本
选中模拟器编译默认是调试版-模拟器版本,选中Generic iOS Device默认是是调试版本-真机版本
生成Release版本的静态库
首先编辑静态库对应的Scheme为Release,然后分别选择模拟器或真机Command + B 进行编译
我们知道模拟器版本的静态库和真机版的是不能通用的,那么怎样让一个静态库即支持模拟器又支持真机呢?
将.framework文件添加到General—> Embedded Binaries 中,不添加会报错
在使用第三方库时有可能会有一个.bundle文件,.bundle其实是一个物理文件夹,里面可以放图片等资源。因为.bundle是一个物理文件夹,所以当被拖入到项目中就不会和自己项目中的图片重名。
使用.a时需要同时将.a 和 .h 文件拖入到工程中,使用.framework时直接将这个文件夹拖入进去即可,因为.framework文件夹中已经包含了.h文件。
.a + .h + .bundle = .framework, 使用.framework更加方便
Swift is not supported for static libraries.
Swift暴漏方法的方式:Swift不像OC那样有头文件,将Swift中的类和方法用public修饰就可以将类和方法暴漏出来
public class Tool : NSObject {
public func tool(){
print(“Test”)
}
}
.a + .h
CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。模拟器上的架构和真机上的架构是不一样的,模拟器和模拟器之间,真机和真机之间的架构也是不同的。如果静态库的架构和测试项目对应的模拟器或真机上的架构不对应就会报“未定义的符号XXX架构”, 由此可以得出模拟器上的静态库!
模拟器架构
- iPhone4s ~ 5 : i386
- iPhone5s ~ 7Plus : x86_64
真机架构
- 3GS~4s : armv7
- 5/5c : armv7s(armv7兼容armv7s)
- 5s ~ 6sPlus : arm64
使用iPhone6s打包的静态库架构是:x86_64, 测试项目选择的是模拟器iPhone5对应的架构是:i386, 架构不匹配所以报Undefined symbols for architecture i386
input file libiFly.a is not a fat file:输入文件libiFly.a不是一个胖文件,胖文件是指只支持一个架构,不兼容其它架构。
让静态库支持所有模拟器对应的架构
静态库有4种版本:
- 调试版本:不会对代码进行优化
- 模拟器版本
- 真机版本
- 发布版本 :会对代码进行优化,执行效率相对调试版本快,但不会有明显的差别
- 模拟器版本
- 真机版本
选中模拟器编译默认是调试版-模拟器版本,选中Generic iOS Device默认是是调试版本-真机版本
生成Release版本的静态库
首先编辑静态库对应的Scheme为Release,然后分别选择模拟器或真机Command + B 进行编译
我们知道模拟器版本的静态库和真机版的是不能通用的,那么怎样让一个静态库即支持模拟器又支持真机呢?
将.framework文件添加到General—> Embedded Binaries 中,不添加会报错
在使用第三方库时有可能会有一个.bundle文件,.bundle其实是一个物理文件夹,里面可以放图片等资源。因为.bundle是一个物理文件夹,所以当被拖入到项目中就不会和自己项目中的图片重名。
使用.a时需要同时将.a 和 .h 文件拖入到工程中,使用.framework时直接将这个文件夹拖入进去即可,因为.framework文件夹中已经包含了.h文件。
.a + .h + .bundle = .framework, 使用.framework更加方便
Swift is not supported for static libraries.
Swift暴漏方法的方式:Swift不像OC那样有头文件,将Swift中的类和方法用public修饰就可以将类和方法暴漏出来
public class Tool : NSObject {
public func tool(){
print(“Test”)
}
}