今日upload package 到 itunes Connect 失败了,原因是引入的一个 .framework
包含了“有问题”的架构,orz...
何为“有问题”,以下是我一个初学者对其的学习和认识,总结如下:
Q1: 静态库和动态库是什么?
A1: 可复用代码我们会封装成函数,多个这样的函数我们会整合到一个或多个源文件作为工具“库”,比如我们会把这些源文件放置到一个 Utility 文件夹,然后在一个头文件中,把允许外部调用的方法都声明在此处;进一步考虑,这些可复用函数依赖关系甚少,起码和业务无关,因此我们可以提前对这些源文件编译成二进制可执行文件,当工程需要用到的时候我们引入这个工具二进制文件即可,而工程会根据前面说到的头文件中声明的函数进行调用,最后整个工程在编译的时候,由于我们工具库已经编译成二进制文件了,因此无须编译,但是在link的时候需要将二进制文件和目标文件(比如.o
,.obj
)link到一起。
Q2: 二进制文件是什么?
A2: 所谓编译就是把源文件.c .m等高级语言写的程序经过编译器一系列处理步骤(预处理->词法分析->语法分析->语义分析->中间语言IR生成->目标代码生成与优化(生成的目标代码是asm汇编)-> 转成机器语言,也就是CPU指令)),这么说来目标文件就是存储了0,1的数据块,关键看CPU如何解释这些0,1,是指令呢还是数据。
Q3: 何为Link?
A3: 编译好的二进制文件最后会和其他目标文件link链接整合成一个二进制文件。简单来说,将一个个二进制文件按照一定顺序整合放置到一起,每个二进制文件都不知道自己会放置在那个地址,但是二进制内部的指标是确定的,因此我们会设置一个默认的地址0x0000000,而内部都是相对地址,当link的时候我们会把预留的默认地址改成正确的地址。
Q4: 静态库和动态库的区别?
A4: 两者都是预先编译好的,在编译整个工程的时候,只对导入的静态库和动态库进行link操作;两者的不同时,静态库在编译的时候会copy一份到最后的目标二进制执行文件,而动态库则不会,而只存储指向动态库的引用。
Q5: 静态库和动态库在各平台上的类型是什么?
A5: window下静态库.lib
,动态库dll
;unix和类unix系统下静态库.a
,动态库.so
;mac系统下静态库.a
和.framework
,动态库.dylib/.tbd
Q6:iOS 的 framework 是什么呢?
A6: framework其实是iOS/mac平台自有的一种格式,其对二进制库,头文件和资源进行了封装,便于分发和管理。系统的framework都是动态库,而自己开发的framework无论是动态还是静态,都是要复制到目标程序的,如此看来,貌似自己开发的都是“静态库”???苹果称之为 embedded framework。
Q7: armv7,armv7s,i386,x86_64架构,为何常说静态库包含了多种架构?
A7: 上述都是指CPU的结构,支持的指令集。iPhone 的硬件配置几乎每年都有更新,其中armv7可简单理解为支持iPhone5之前的设备;而armv7s支持iPhone5之后的设备,arm64是更新的设备;i386和 x86_64 都是指PC的架构,前者是旧的mac,32位的,后者是64位。
Q8: 如何查看一个静态库包含哪些架构:
A8: 使用lipo -info library
命令,其他操作还有从已有库中移除/添加/瘦包/,更多使用可用man lipo
查看。