About framework used - ShenYj/ShenYj.github.io GitHub Wiki

About framework used

准备一个空项目、一个framework 动态库和 .xcconfig 文件

  • 项目目录结构

    .
    ├── DashLine.xcframework
    │
    ├── FrameworkUsed
    |   ├── Config.xcconfig
    │   ├── AppDelegate.swift
    │   ├── Assets.xcassets
    │   ├── Base.lproj
    │   │   ├── LaunchScreen.storyboard
    │   │   └── Main.storyboard
    │   ├── Info.plist
    │   ├── SceneDelegate.swift
    │   └── ViewController.swift
    └── FrameworkUsed.xcodeproj
  • ViewController.swift 中的代码

    import UIKit
    import DashLine
    
    class ViewController: UIViewController {
        
        private var dashLine: DashLine?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            
            //dashLine = DashLine()
            if let dashLine = dashLine {
                dashLine.frame = CGRect(x: 20, y: 100, width: UIScreen.main.bounds.width - 40, height: 2)
                view.addSubview(dashLine)
            }
            
            dashLine?.updateLine()
        }
    }

    dashLine 是可选项,如果是必选项,初始化这句代码 dashLine = DashLine() 在缺失某些参数的情况下就会直接崩溃
    示例项目下载链接

通过探索 静态库 得知使用类库的三要素:

  1. 头文件路径
  2. 库文件路径
  3. 库文件名称

并且此处使用的是动态库,由于动态库的链接方式,还需要为其指定 run path, 告诉 dyld 去哪里找动态库

  1. run path

否则运行时报错 dyld[65364]: Library not loaded: @rpath/DashLine.framework/DashLine (编译通过)

此时的 .xcconfig文件内容如下:

// 1. -I: 头文件
HEADER_SEARCH_PATHS = $(inherited) ${SRCROOT}/DashLine.framework/Headers
// 2. -F: framework 所在目录
FRAMEWORK_SEARCH_PATHS = $(inherited) ${SRCROOT}
// 3. framework 名称
OTHER_LDFLAGS = $(inherited) -framework "DashLine"
// 4. 动态库的路径
LD_RUNPATH_SEARCH_PATHS = $(inherited) ${SRCROOT}

并没有将动态库拖入项目设置成embed in, 将类库拖入并设置 embed in等同于设置了 run path

另外在探索 符号 时,提到过 弱定义弱引用 符号, 改一下.xcconfig文件

// 1. -I: 头文件
HEADER_SEARCH_PATHS = $(inherited) ${SRCROOT}/DashLine.framework/Headers
// 2. -F: framework 所在目录
FRAMEWORK_SEARCH_PATHS = $(inherited) ${SRCROOT}
// 3. framework 名称 (弱引用)
OTHER_LDFLAGS = $(inherited) -Xlinker -weak_framework -Xlinker "DashLine"

通过 .xcconfig 的设置使用总结:

  • 三要素必备,未设置run path: 编译通过,运行报错 Library not loaded
  • 三要素必备,未设置run path, 弱引用: 编译通过,运行通过

    并不绝对,需要看实际情况,比如打开注释的实例化这一行,运行就会直接崩溃

  • 三要素 + run path: 正常的使用场景,等同于我们设置 embed in
⚠️ **GitHub.com Fallback** ⚠️