Static Mach-O Framework
先说结论,修改Build Setting——Linking——Match-O Type,来决定以什么样的命令处理Target
将 .framework的 Match-O Type改为 StaticLibrary 即得到 Mach-O为 StaticLib 的framework文件, 即可执行文件为 .o 的压缩包
会引发的问题
Framework无法被Load引发资源读取问题
因为使用了静态Mach-O,就不能使用 [self class]来读取自身的Bundle,必须用path的方式读取,例如
1 | NSString *path = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/Frameworks/staic.framework"] |
无用的可执行文件
根据文章Link与符号表的关系,在Target.app情况下,
- Static Mach-O Framework的代码会进入 Target.app
- 但是又因为Copy Framework的原因,Framework会被拷贝进入Frameworks文件夹
也就是说
二进制存在的Mach-O | 来源 | Mach O类型 |
---|---|---|
Target.app/Target | 在Link过程中,Link进入App本身的Mach-O中一份 | Executable,连续地址的Mach O |
Target.app/Frameworks/static.framework/statict | Static Framework本身的Mach-O | Static,.o文件的压缩包,不可以被执行 |
其中Frameworks下的Static Mach-O中 .o 压缩包 是一个无用的文件
符号表的问题
由于更改了Mach-O,那么当前Product生成的framework中的文件,相当于一个StaticLib,.o文件的压缩包
其它Mach-O Link到 Static.framework
根据测试,其Mach-O就是一个普通的静态库,
Link Component | To Module | Explain | Enter OR Not | Same As To StaticLib |
---|---|---|---|---|
StaticLib.a | Static.framework | 静态库–>静态库 | Enter | Same |
Dynamic.framework | Static.framework | 动态库–>静态库 | Not | Same |
Static.framework Link到其它Mach-O
我们发现静态的Framework在Link到其它Mach-O时 和单纯的StaticLib有差别
Link Component | To Module | Explain | Enter OR Not | Result Mach-O | Backup | Same As StaticLib |
---|---|---|---|---|---|---|
Static.framework | Static.framework | 静态Framework–>静态Framework | Not | StaticLibrary+StaticLibrary | 因为-framework参数,倒是不会合并.o压缩包 | Different |
Static.framework | StaticLib.a | 静态Framework–>静态库 | Not | StaticLibrary+StaticLibrary | 也是因为-framework参数 | Different |
Static.framework | Dynamic.framework | 静态Framework–>动态库 | Enter | DynamicLibrary | 会进入动态库,但是如果动态库里没有使用到,就会被Strip掉 | Same |
Static.framework | App | 静态Framework–>App | Enter | Executable | 静态库的代码进入了App,组成了可执行文件 | Same |
可以发现区别在于
- 当Static.framework连接到 静态的Mach-O(包含静态库和静态Framework) 时,并不会和Static.lib 一样把 .o文件进入到目标的Mach-O
原因在于Create StaticLib的过程中命令行的参数不同,所以 在-framework参数下的 .o 文件并不会进入目标的 Mach-O
1 | // 1. Link StaticLib |
根据libtool命令行的解释 -framework参数来自 ld 命令,其关于Libraries中对动态库描述如下
1 | A static library (aka static archive) is a collection of .o files with a table of contents that lists the global |