Scope的概念
Xcode的工程中存在Scope的概念会影响到Xcode的工程配置,主要是以下为主
和Scope相关的工程配置
Setting | Scope | 作用 |
---|---|---|
Target Dependencies | Project | 编译当前Target时先编译另一个 |
Linked Binary With Libraries | WorkSpace | 组合符号表,完成Mach-O文件的生成 |
Embedded Binaries | WorkSpace | 一步完成Link和Copy资源两步操作 |
Target Dependencies
Target Dependencies 首先是可视范围仅仅在Project之内的Target之间,Target只能操作Project内的对象
真正的作用仅有一项,用于在 编译当前Target时,优先编译另外一个Target ,这也是为什么可视范围只有Project的原因
经过测试Target Dependencies 的顺序也会对编译先后产生影响,应该只是产生编译命令时候的配置文件导致的,该特性并不完全可靠
Linked Binary With Libraries
Linked Binary With Libraries 的Scope范围是整个Workspace,其可以操作Workspace内所有可以被Link的对象
所谓可以被Link的对象就是 .a 和 .framework 也就是Mach-O为 DynamicLibrary 和 StaticLibrary的 对象,Link的结果会决定Mach-O文件如何生成(后续详细讨论)
Embedded Binaries
我们在上述文章里提到,Framework是代码和资源的集合,所以Xcode加入了 Embedded 这个操作来处理Framework,可以一键执行两步动作
- 把Framework加入Linked Binary With Libraries
- 在Build Phase里创建 Embed Frameworks的步骤,进行对Framework资源的拷贝
常见的错误观点
Framework时需要同时添加 Target Dependencies 和 Link Binary With Libraries
在苹果的官方文档和Stack Overflow中对Target Dependencies的提示多数会搜到这个答案
正确答案是 Framework只需要Embedded
Target Dependencies 和 Linked Binary With Libraries 会对当前 Target.app 的依赖是否会重新编译一个较新版
正确答案是 无论采用何种配置,Target.app 都会重新编译当前 WorkSpace 中所依赖的其它对象,如.a或.framework,如果工作目录存在缓存则会省去Compile的时间