静态库
2015-10-22 10:16
423 查看
1.静态库和动态库的区别
静态库(包括.a和.framework文件),链接时,静态库会被完整地复制到可执行文件中,如果被多次使用就会有多次冗余拷贝
动态库(包括.dylib和.framework文件),链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,可供多个程序公用,节省内存,
看起来好像是动态库比较好,但是苹果官方规定,如果项目中使用了自制的动态库,就不允许上传AppStore
2.静态库一般的用途
1)核心技术不希望对外开放
2)把MRC打包成.a文件,用于ARC项目
3.制作静态库
1)xcode-->File --> new --> project --> Framework & Library --> Cocoa Touch Static Library (名字中不要出现中文,否则会有奇怪的问题)
2)直接 command + B 编译,生成红色的.a文件。再选择 iOS Device 编译,就可以生成对应的文件了
4.静态库中需要暴露给外界的.h文件
targets --> Build Phases --> Copy Files --> 选中需要添加的.h文件,之后重新编译静态库即可
5.问题
1)如果是使用某个模拟器编译的.a文件,之后用于真机或者其他模拟器,就会编译错误:undefined symbols for architecture i386,表示现在这个静态库在i386架构上是不可用的
2)可以理解为每个手机的cpu架构都是不一样的,所以用某个模拟器编译的静态库只能用于同一模拟器上
模拟器:
iPhone4s 到 iPhone5 :i386
iPhone5s 到 iPhone6plus : x86_64
真机:
iPhone3gs 到 iPhone4s :armv7
iPhone5 到 iPhone5c :armv7s
iPhone5s 到 iPhone6plus :arm64
3)查看某个静态库文件是使用的什么架构进行编译的命令:lipo -info 静态库.a
也可以将几个不同架构上编译的静态库进行合并,则合并之后的静态库可以同时运行在几个不同的架构上:lipo -create 静态库1.a 静态库2.a -output 合并后的静态库.a
也可以设置,让静态库同时支持几个架构:
target --> Build Settings --> Build Active Architecture Only (只编译当前活跃的架构) 设置为NO即可
在这个地方可以看到 Release和Debug两个选项,其中Release默认为NO,Debug默认为YES
6.release发布版本和debug版本的区别
一个是发布版本,一个是调试版本。调试版本系统会显示更多信息用于调试,发布版本就没有这些信息了。另外发布版本比调试版本略小
7.怎么编译release版本的静态库
Edit Scheme --> Run --> 把debug改为release
8.静态库不能调试
可以创建一个专门用于调试静态库的项目,在项目中创建静态库,调试成功之后用真机编译就可以生成对应的静态库文件,可以用于其他项目了
9.如果静态库中用到了图片
》编译好的静态库是不包含它用到的图片的,如果其他项目用到了,最笨的方法是把静态库拷贝过去,同时把图片文件也拷贝过去
但是这么做一来比较麻烦,二来如果新项目中有的图片文件名和静态库中的图片文件名一样,就会出错,比较好解决方法是将图片文件打成bundle包
bundle的本质就是一个文件夹,将文件夹的后缀名改为.bundle就制作好了一个bundle文件
》需要注意的是,打成bundle包之后,静态库中用到图片的时候不能再直接写[UIImage imageWithNamed:@"imgName.png"]了,需要使用图片的全路径来加载:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"imgName.png" ofType:nil inDirectory:@"bundleName.bundle"];
10.制作framework
类似制作.a
静态库(包括.a和.framework文件),链接时,静态库会被完整地复制到可执行文件中,如果被多次使用就会有多次冗余拷贝
动态库(包括.dylib和.framework文件),链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,可供多个程序公用,节省内存,
看起来好像是动态库比较好,但是苹果官方规定,如果项目中使用了自制的动态库,就不允许上传AppStore
2.静态库一般的用途
1)核心技术不希望对外开放
2)把MRC打包成.a文件,用于ARC项目
3.制作静态库
1)xcode-->File --> new --> project --> Framework & Library --> Cocoa Touch Static Library (名字中不要出现中文,否则会有奇怪的问题)
2)直接 command + B 编译,生成红色的.a文件。再选择 iOS Device 编译,就可以生成对应的文件了
4.静态库中需要暴露给外界的.h文件
targets --> Build Phases --> Copy Files --> 选中需要添加的.h文件,之后重新编译静态库即可
5.问题
1)如果是使用某个模拟器编译的.a文件,之后用于真机或者其他模拟器,就会编译错误:undefined symbols for architecture i386,表示现在这个静态库在i386架构上是不可用的
2)可以理解为每个手机的cpu架构都是不一样的,所以用某个模拟器编译的静态库只能用于同一模拟器上
模拟器:
iPhone4s 到 iPhone5 :i386
iPhone5s 到 iPhone6plus : x86_64
真机:
iPhone3gs 到 iPhone4s :armv7
iPhone5 到 iPhone5c :armv7s
iPhone5s 到 iPhone6plus :arm64
3)查看某个静态库文件是使用的什么架构进行编译的命令:lipo -info 静态库.a
也可以将几个不同架构上编译的静态库进行合并,则合并之后的静态库可以同时运行在几个不同的架构上:lipo -create 静态库1.a 静态库2.a -output 合并后的静态库.a
也可以设置,让静态库同时支持几个架构:
target --> Build Settings --> Build Active Architecture Only (只编译当前活跃的架构) 设置为NO即可
在这个地方可以看到 Release和Debug两个选项,其中Release默认为NO,Debug默认为YES
6.release发布版本和debug版本的区别
一个是发布版本,一个是调试版本。调试版本系统会显示更多信息用于调试,发布版本就没有这些信息了。另外发布版本比调试版本略小
7.怎么编译release版本的静态库
Edit Scheme --> Run --> 把debug改为release
8.静态库不能调试
可以创建一个专门用于调试静态库的项目,在项目中创建静态库,调试成功之后用真机编译就可以生成对应的静态库文件,可以用于其他项目了
9.如果静态库中用到了图片
》编译好的静态库是不包含它用到的图片的,如果其他项目用到了,最笨的方法是把静态库拷贝过去,同时把图片文件也拷贝过去
但是这么做一来比较麻烦,二来如果新项目中有的图片文件名和静态库中的图片文件名一样,就会出错,比较好解决方法是将图片文件打成bundle包
bundle的本质就是一个文件夹,将文件夹的后缀名改为.bundle就制作好了一个bundle文件
》需要注意的是,打成bundle包之后,静态库中用到图片的时候不能再直接写[UIImage imageWithNamed:@"imgName.png"]了,需要使用图片的全路径来加载:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"imgName.png" ofType:nil inDirectory:@"bundleName.bundle"];
10.制作framework
类似制作.a
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 深入探讨Linux静态库与动态库的详解(一看就懂)
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- linux生成(加载)动态库静态库和加载示例方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器