About framework used - ShenYj/ShenYj.github.io GitHub Wiki
准备一个空项目、一个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()
在缺失某些参数的情况下就会直接崩溃
示例项目下载链接
通过探索 静态库 得知使用类库的三要素:
- 头文件路径
- 库文件路径
- 库文件名称
并且此处使用的是动态库,由于动态库的链接方式,还需要为其指定 run path
, 告诉 dyld
去哪里找动态库
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