from:http://www.cnblogs.com/perryxiong/p/3759818.html

 

最近我在项目中遇到一些工程之间的管理问题。

模型:

其中 库A 是一个公共的基础静态库, M_A依赖A, N_A依赖A, 而项目工程Test依赖A,M_A,N_A这三个库。

用workspace管理项目和依赖的库

Test,A库,M_A库,N_A库分别为4个Project,并被一个workspace进行管理,看截图:

按照常规,我们会在M_A, N_A静态库项目的Build Phases->Link Binary With Libraries中添加A.framework。在Test项目的相同位置添加A.framework,M_A.framework, N_A.framework。

编译一下没有问题。

出现Duplicate symbols问题

但是如果A中有某个.m文件仅仅只有类的category。那么默认情况下,是不会被加载的。这个时候我们需要在Build Settings中的Other link flags中添加-ObjC参数。这个时候问题出现了,编译test时会出现duplicate symbols的错误。

这是因为XCode发现存在多份A的object文件,XCode认为这样会出现问题,于是报错。

那么如果解决duplicate symbols这个问题呢? 其实很简单,我们在XCode编译M_A.framework以及N_A.framework时不要link A.framework就好了。我们在M_A与N_A的target配置中Build Phases->Link Binary With Libraries删除A.framework。

如下图:

Test这个Target是必须要把依赖库加进来的,因为编译成.app必须要link

解决工程编译顺序的问题

好了。现在编译一下test工程,发现还是错误,说找不到<A/A.h>。但是再编译两次,第三次就发现编译过了。

原因是在头两次编译中,将A.framework,M_A.framework,N_A.framework编译到build路径下。第三次因为test的库都已经有了,于是就编译通过。这其实涉及到一个编译顺序的问题。XCode先编译test工程了,它发现找不到需要的头文件(这个时候它依赖的库还没有生成好)。

XCode总是未卜先知,它可以帮我们解决这个问题。我们在Product->Schemes->Edit Schemes。在左侧表单中选择第一个Build。将Parallelize Build与Find Implicit Dependencies前面的勾去掉。

再将目标文件A.framework,N_A.framework,M_A.framework按依赖顺序插到Test前面,越底层的更靠前,并将后面所有的check box都勾上。如下图:

OK确认后,再进行编译,发现是不是没有问题了。

Clean Workspace

另外在workspace下,如果想把所有project都clean下,需要点击菜单上的Product后,按住option键,发现Clean命令变成了Clean Build Folder了。点击Clean Build Folder就把workspace下的Build文件夹全部删除掉。

团队协作

公司往往有一个团队来协作完成一个App,那么怎么把刚才的设置能共别人使用呢?就是别人从代码仓库获取代码后,就有同样的scheme设置。那么我们就要设置下scheme的共享。

在Product->Schemes->Edit Schemes->Manage Schemes...弹出的面板中,将test工程最后面那个checkbox给勾上,lib的勾不勾无所谓。

最后要把这个shemes文件加到仓库中提交, 之前大部分人可能都把它忽略掉得,包括我,因为觉得没用。

最新文章

  1. 码代码新神器-Github Atom
  2. ListView——android菜鸟成长之路
  3. LeetCode - Populating Next Right Pointers in Each Node II
  4. Asp.net中实现同一用户名不能同时登录(单点登录)
  5. jquery 判断checkbox是否为空的三种方法
  6. 利用crontab自动更新SVN代码
  7. QProcess调用外部程序方式的差异
  8. NSDateFormatter 格式说明
  9. hackerrank【Lego Blocks】:计数类dp
  10. 虚拟机VirtualBox和Ubutu
  11. C/C++的静态库与动态库
  12. PHP的数据类型和魔术常量
  13. 使用PL/SQL能查询oracle中数据,在for update 语句中一直卡住
  14. leetcode — anagrams
  15. hbase region still in transition
  16. Linux基础命令---vim文本编辑
  17. Vue2.5开发去哪儿网App 第五章笔记 上
  18. 打开word文档时提示“Microsoft Office Word已停止工作”
  19. OpenCV——Mat类的创建、复制、函数
  20. ExtJs中XTemplate使用(转)

热门文章

  1. 邵国际: C 语言对象化设计实例 —— 命令解析器
  2. Vue基础系列(三)——Vue模板中的数据绑定语法
  3. mongodb定时删除数据(索引删除)
  4. python机器学习——逻辑回归
  5. Spring Boot2 系列教程(二十四)Spring Boot 整合 Jpa
  6. Bootstrap3中的affix的使用Demo
  7. 正则表达式 第六篇:调用CLR函数执行正则查询
  8. word2vec C源码解析
  9. 剑指Offer-32.丑数(C++/Java)
  10. Linux高级命令-sort、uniq、 cut、sed、grep、find、awk