• 主页
  • 系列总集
  • OpenCV
  • CMake
  • iOS
  • Java
  • 前端
所有文章 关于我

  • 主页
  • 系列总集
  • OpenCV
  • CMake
  • iOS
  • Java
  • 前端

模块化与Framework(14):静态编译Static Framework

2017-07-14

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
2
3
4
5
6
7
8
9
10
11
// 1. Link StaticLib
...XcodeDefault.xctoolchain/usr/bin/libtool -static
......
-lStaticLib <=====使用的 -l 参数


// 1. Link StaticFramework
...XcodeDefault.xctoolchain/usr/bin/libtool -static
......
-framework StaticFrame <=====使用的-framework参数

根据libtool命令行的解释 -framework参数来自 ld 命令,其关于Libraries中对动态库描述如下

1
2
3
4
5
A static library (aka static archive) is a collection of .o files with a table of contents that lists the global
symbols in the .o files.

Exported symbols from the dynamic library are used to resolve references.

赏

请问老板还招人么(/ω\)

支付宝
微信
  • iOS
  • IDE
  • Xcode
  • Compiler
  • Framework
  • Tutorial

扫一扫,分享到微信

微信分享二维码
模块化与Framework(15):特殊的Unique Framework
模块化与Framework(13):多版本和Umbrella Framework
© 2021 Alan Li
Hexo Theme Yilia by Litten
  • 所有文章
  • 关于我

tag:

  • iOS
  • Java
  • Collection
  • Python
  • Shell
  • CMake
  • Memory
  • JavaScript
  • Architecture
  • AnchorPoint
  • Android
  • Web
  • Annotation
  • AFNetworking
  • Window
  • ViewController
  • AutoLayout
  • Dozer
  • CoreAnimation
  • Cycle Retain
  • Block
  • UI
  • IDE
  • FrontEnd
  • CSS
  • Category
  • TableViewCell
  • Security
  • Net
  • JSP
  • Spring
  • C
  • MyBatis
  • Date
  • React
  • GCD
  • UITouch
  • Gesture
  • UIControl
  • Git
  • HTML
  • HTTPS
  • HTTP
  • Servlet
  • Server
  • DataBase
  • MySQL
  • Linux
  • Tutorial
  • Ajax
  • Type
  • JQuery
  • JSON
  • Exception
  • Parameter
  • Reflect
  • Thread
  • Sort
  • KVO
  • MKMapKit
  • Overlay
  • Maven
  • Configure
  • Tips
  • Transaction
  • Swift
  • NavigationBar
  • Nginx
  • Runtime
  • OpenCV
  • Property
  • Playground
  • Protocol
  • Redux
  • ScrollView
  • Session
  • Cookie
  • Shiro
  • Error
  • Singleton
  • RegEx
  • StackView
  • StatusBar
  • Base64
  • Socket
  • TCP
  • IP
  • TextField
  • CALayer
  • UILabel
  • View
  • Animation
  • Xcode
  • Hexo
  • Terminal
  • OC
  • Device
  • Log
  • Image
  • JUnit
  • Oval
  • Archive
  • XSS
  • Compiler
  • Aspect
  • Responder
  • Class
  • FireWall
  • RetainCount
  • Const
  • Frame
  • String
  • Symbols
  • Framework
  • CocoaPods
  • Unity
  • Message
  • Button
  • AuthorizationStatus
  • Struct
  • XCTest
  • NSNotification
  • Contact

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

我写的,大概率是错的。。。。。