【发布时间】:2018-02-21 10:32:52
【问题描述】:
当我想在iOS 应用程序中使用框架时,例如CoreLocation,我应该在Linked Frameworks and Libraries 中链接它们吗?我知道它在 CoreLocation 的文档中是这样说的,但是为什么不添加这个框架就可以正常工作呢?例如与UIKit 相同。为什么不链接就可以工作,链接好还是不链接好?
【问题讨论】:
当我想在iOS 应用程序中使用框架时,例如CoreLocation,我应该在Linked Frameworks and Libraries 中链接它们吗?我知道它在 CoreLocation 的文档中是这样说的,但是为什么不添加这个框架就可以正常工作呢?例如与UIKit 相同。为什么不链接就可以工作,链接好还是不链接好?
【问题讨论】:
在链接时,应用必须始终了解其符号直接从目标代码中引用时它使用的所有框架和库。
由于每个有用的 iOS 应用程序都需要 UIKit,因此它始终是隐式链接的。这是 Xcode 中的首选项,您可能无法更改。还有许多其他库(例如libc、libm、libSystem)和一些框架(例如Foundation.framework、QuartzCore.framework)也被隐式链接。一些库和框架是间接链接的,例如基础包括libSystem 和libobjc。
链接器必须知道所有这些库和框架。因此,Xcode 创建了一个名为<Project>_dependency_info.dat(例如TestApp_dependency_info.dat)的文件,该文件位于构建文件夹的某个位置。该文件包含显式和隐式链接的所有库和框架。即使对于 Swift 中的小型 Hello World 项目,此文件的大小也已达到 20kb。
但并非每个应用程序都使用 Core Location、MapKit、WebKit 等或像 libz 这样的库,并且每个额外的框架和库都会减慢链接阶段。当然,Apple 无法知道您想要包含在项目中的每个(自定义)框架或库。因此,您必须通过将它们添加到Linked Frameworks and Libraries来显式添加这些库。
这种自动集成必要框架和手动可选的机制最终是一种非常实用的方法。
【讨论】: