创建真机.a
创建模拟器.a
合成支持模拟器的和真机的
如果Valid Architectures中添加了armv7s,就一定得添加armv7
取出armv7平台的包:
查看库中所包含的文件列表:
在 Mac 上可以用 Mac 的反编译工具的otool 这个命令来反编译 .o 文件,比如 otool -tv xx.o
苹果 A7 处理器支持两个不同的指令集,32位 ARM 指令集(armv6 | armv7 | armv7s),64位 ARM 指令集 (arm64)
i386/x86_64:
ARMv8/ARM64
Architectures
指定工程支持指令集的集合,设置多个 Architecture 则会在生成的包中包含多个指令集
默认 Standard architectures(armv7,arm64) (之前的Xcode版本中默认设置还包括armv7s,现在去掉了,估计是因为armv7s相较armv7优化不大,能向下兼容,而设置后还会增大二进制包的大小)
模拟器
真机
Valid Architectures
Build Active Architecture Only
是否只针对当前连接设备所支持的指令集编译
默认 Debug 为 YES, Release 为 NO
lipo是管理Fat File的工具, 可以查看cpu架构, 提取特定架构,整合和拆分库文件
库(Library)是一段编译好的二进制代码,加上头文件就可以供别人使用。编译的时候只需要link一下,link(链接阶段)的不同的形式(静态或动态)决定库是静态库还是动态库
编译过程:
源文件 -> 预编译 -> 编译 -> 汇编 -> 链接 -> 可执行文件
一般会有两种情况要用到库:
静态库在链接(link)阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,对应的链接方式称为静态链接。一个静态库可以简单看成是一组目标文件(.o/.obj文件)的归档集合
静态库的特点:
framework和.a两种静态库的区别
动态库在链接(link)阶段,不会被链接到目标代码中,而是在程序运行是才被载入
动态库(也称共享库)的特点:
程序运行时才被载入
动态库可以包含静态库,也能自动link所需要的依赖库
与运行环境隔离
注意:
1 苹果在iOS 8之前并不支持自己开发的framework.
2 自己开发的framework无论是动态还是静态的,都要复制到目标程序,苹果又把这种Framework叫做Embedded Framework
3 Xcode中需要导入我们自己制作的动态库时,需要在Xcode中的Build phase->Copy Files选项添加,其中destination选择“Frameworks”,不然会报错:image not found。
$ cd myframework.Frameworks
$ ls -l
myframework
$ file myframework
#静态库,显示archive
> myframework.Frameworks: Mach-O universal binary with 2 architectures: [arm_v7:current ar archive] [arm64]
> myframework.Frameworks (for architecture armv7): current ar archive
#动态库,dynamically
> myframework: Mach-O universal binary with 2 architectures: [arm_v7] [arm64:Mach-O 64-bit dynamically linked shared library arm64]
> myframework (for architecture armv7): Mach-O dynamically linked shared library arm_v7
lipo -create 模拟器静态库(动态库) 真机静态库(动态库) -output 新静态库的名称(动态库)
注意:
动态库不是合成.framework,是合成.framework里面的一个黑色文件(二进制文件),生成的也是这个黑色文件,只需将合成的黑色文件替换就好了
如果制作的是动态库的话,一定要embeded binaries中将库导入一下(target —> General —> Embedded Binaries下添加你的动态链接库)
如果库中包含系统的分类,一定要在target linker flag 里面配置-ObjC以及-all_load
NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/FWPaySdk.framework/FWPaySdk",NSHomeDirectory()];
NSError *err = nil;
NSBundle *bundle = [NSBundle bundleWithPath:documentsPath];
if ([bundle loadAndReturnError:&err]) {
NSLog(@"bundle load framework success.");
} else {
NSLog(@"bundle load framework err:%@",err);
}
Class worder = NSClassFromString(@"FWorder");
FWorder * order = (FWorder *)[[worder alloc] init];
Headers
binary文件
.bundle
[UIImage ImageWithName:]
读取图片。要先找到bundle包再拿图片
#define BUNDLE_NAME @"Resources.bundle"
#define BUNDLE [NSBundle bundleWithPath: [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: BUNDLE_NAME]]
#define LOADIMAGE(name) [UIImage imageWithContentsOfFile:[[BUNDLE resourcePath] stringByAppendingPathComponent:name]]
Info.plist和Modules
注意:
1 Framework是动态库还是静态库,取决于编译成的Mach-O(就是那个二进制文件)
2 Buiding Setings -> Mach-O Type: 默认选择的是Dynamic Library(动态库),选择Static Library是静态库
agvtool
版本号(Version)
Info.plist
文件的 CFBundleShortVersionString (Bundle versions string, short)
中编译号(Build)
Info.plist
文件的 CFBundleVersion (Bundle version)
中注意:如果应用程序包含了多个目标(target),
agvtool
工具将会把所有目标都设置为同一个版本号和编译号。
project.pbxproj
包含了 CURRENT_PROJECT_VERSION (Current Project Version)
编译设定,这个编译设定指定了当前工程的版本。agvtool 会搜索此编译选项。如果这个值存在就运行,否则不运行,这个值用来更新编译号/*
注意:
如果存在多个Xcode需要选择一个,否则报错。
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
*/
agvtool new-marketing-version 2.1
//自动更新编译号
agvtool next-version -all
//更新编译号
agvtool new-version -all 2.1
agvtool what-marketing-version
agvtool what-version
共同点
区别
Xcode设置了Header Search Paths,则一定会去搜索的。
UserHeader Search Paths只有在Always Search User Paths(是否搜索用户路径)为Yes时才会被搜索
xcode中embed的framework,都是需要签名的。如果在生成framework时,签过名了,就不用在选上 code sign on copy选项了。如果没有签过名,必须选上,不然无法在真机上运行!
对于链接的系统动态库而言,由于ios的系统是在不断的升级中,必然会引入不少新功能和新API,而大多数都是会以.framework的方式提供给开发者。如果开发者使用了这些新引入的.framework,那么因为app的用户的系统版本不是统一的,所以用户机器上不一定都存在该动态库,此时就应该把链接的这些新的.framework改成Optional的,然后在程序代码中去动态判断用户版本,来启动对应的新功能,如果不修改成Optional而保持Required的话,在部分不存在该动态库用户的机器上,就会导致app一启动就退出,因为找不到对应的动态库
原因是没有把对外部公开的类,放到public里面
注意:如果Public中的头文件,import了其他的头文件,也要放倒public里
1 xcode6不再构建arm7s
2.iOS开发——制作同时支持armv7,armv7s,arm64,i386,x86_64
3.iOS Device Compatibility Reference
4.App Distribution Guide
5.iOS Build Settings Architectures
6.关于Xcode “Build Setting”中的Architectures详解
7 WWDC 2014 Videos
8 使用CocoaPods开发并打包静态库
10 iOS 最新framework和.a静态库制作及使用全解(含工程套工程,多工程联调)
11 iOS 静态库,动态库与 Framework)
12 App Extension Programming Guide
13 iOS静态库SDK制作(包含第三方静态库)
14 Automating Version and Build Numbers Using agvtool