Link 的类型
根据上文我们知道,可以被Link的有 StaticLib.a(静态库) 和 Dynamic.framework(动态库) 可以进行Link,而其本身的Mach-O文件符号表也是不同的
Link | 符号表类型 |
---|---|
StaticLib.a | .o文件的压缩包 |
Dynamic.framework | 可以执行的Mach-O文件 |
Link Binary 的结果
在项目复杂的引用关系中会,让人产生疑惑的是代码最终都存在于哪个Mach-O文件
我们可以根据需要Link的对象,以及Link的目标结果整理出一张表,可能性公存在6种
Link Component | To Module | Explain | Enter OR Not | Result Mach-O | Backup |
---|---|---|---|---|---|
StaticLib.a | StaticLib.a | 静态库–>静态库 | Enter | StaticLibrary | 组成新的静态库,包含了两者所有的.o文件,仍是.o文件压缩包 |
StaticLib.a | Dynamic.framework | 静态库–>动态库 | Enter | DynamicLibrary | 静态库的代码进入了动态库,组成新的动态库 |
Dynamic.framework | StaticLib.a | 动态库–>静态库 | Not | DynamicLibrary+StaticLibrary | 两者都不会产生任何变化,动态库代码不会进入静态库 |
Dynamic.framework | Dynamic.framework | 动态库–>动态库 | Not | DynamicLibrary+DynamicLibrary | Component的Class会以 U(未定义) 的形式进入 Module |
StaticLib.a | App | 静态库–>App | Enter | Executable | 静态库的代码进入了App,组成了可执行文件 |
Dynamic.framework | App | 动态库–>App | Not | Executable+DynamicLibrary | 动态库以拷贝的形式进入App的Frameworks文件夹(包含了代码和资源),但是不会进入App的Mach-O |
总结来看就是静态库Mach-O会进入所有的静态库/动态库/App的Mach-O,动态库不会进入任何的Mach-O文件,运行App也是通过资源拷贝的形式拷贝进去
疑问
叉状引用静态库为何不出现重复的符号
在工程中常见的就是混乱的叉状引用关系
![image01][image01]
根据以上结论,其中StaticLibA(包含A与B的Mach-O),而App(包含B的Mach-O)按照上述理论应该会出现Duplicated Symbols的错误
但是在实际执行的过程中并不会出现 原因会在下文分析
静态的Framework(不推荐,没有需求不要看了)
这个本身是个错误的概念参考StackOverflow回答,指的是用一个framework包起来Static Lib和头文件,!!是一种不被官方支持的方法!!
但是根据一种特殊的需求—————————— Unique Framework
Unique Framework的概念:
- Unique Framework是类似Mac系统中Umbrella Framework的概念,但是官方并没有提供支持的方法
- 和 Fat Framework的别称 Universal Framework不是一个概念
- 这个名字是我自己瞎起的
我们还是可以尝试修改Build Setting——Linking——Match-O Type,来决定以什么样的命令处理Target
试将 .framework的 Match-O Type改为 StaticLibrary 即得到 Mach-O 为 Static 的framework文件,下文后续会详细介绍