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文件加到仓库中提交, 之前大部分人可能都把它忽略掉得,包括我,因为觉得没用。

用workspace管理工程,并解决多静态库依赖的更多相关文章

  1. Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。

    http://www.cocoachina.com/bbs/read.php?tid-282490.html Xcode6.1标准Framework静态库制作方法.工程转Framework,静态库加x ...

  2. 解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题

    解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题 在原来项目中导入全志v3相机的 ...

  3. iOS 在工程内部创建一个静态库target

    当你在开发项目的时候需要把公用的东西打包出来,其他项目方便使用的时候,打包成静态库是你的最优选择,在工程内部开发的时候新建一个target进行静态库的开发可以使你的开发调试更加方便而不是单独新建一个工 ...

  4. 再议GCC编译时的静态库依赖次顺问题

    假设有如三个源代码文件: $ cat a.cpp void a() { } $ cat b.cpp extern void a(); void b() { a(); // 调用a.cpp中的a() } ...

  5. 重写kinect2_viewer,编译高博kinect2在orbslam2上跑的程序(解决cmakefile中库依赖和头文件的问题)

    该方法详述了高博kinect2_viewer的编译过程 //...................................................................... ...

  6. 再议GCC编译时的静态库依赖顺序问题

    相关博文1:http://blog.chinaunix.net/uid-20682147-id-76330.html相关博文:http://blog.chinaunix.net/uid-2068214 ...

  7. Qt Creator 源码学习笔记03,大型项目如何管理工程

    阅读本文大概需要 6 分钟 一个项目随着功能开发越来越多,项目必然越来越大,工程管理成本也越来越高,后期维护成本更高.如何更好的组织管理工程,是非常重要的 今天我们来学习下 Qt Creator 是如 ...

  8. mac下svn问题——“.a”(静态库)文件无法上传解决

    mac下svn问题——“.a”(静态库)文件无法上传解决    “.a”(静态库)文件无法上传(svn工具:Versions)          网上查询了一下,说是Xcode自带的svn和Versi ...

  9. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

随机推荐

  1. mysql cpu使用率过高解决方法

    mysql cpu使用率过高解决方法 1 mysql查看正在运行的语句 并且查看运行最多的mysql语句 MySQL 打开 general log 后,所有的查询语句都会记录在 general log ...

  2. K8S入门系列之集群二进制部署-->master篇(二)

    组件版本和配置策略 组件版本 Kubernetes 1.16.2 Docker 19.03-ce Etcd 3.3.17 https://github.com/etcd-io/etcd/release ...

  3. 【algo&ds】0.数据结构和算法入门

    解决问题方法的效率,跟数据的组织方式有关 解决问题方法的效率,跟空间的利用效率有关 解决问题方法的效率,跟算法的巧妙程度有关 什么是数据结构 数据对象在计算机中的组织方式 逻辑结构 物理存储结构 数据 ...

  4. Linux系统中nc工具那些不为人知的用法

    Linux nc命令用法 参考地址:https://www.cnblogs.com/jjzd/p/6306273.html -g<网关>:设置路由器跃程通信网关,最多设置8个; -G< ...

  5. git push后出现错误 ![rejected] master -> master(non-fast-forward) error:failed to push some refs to 'XXX'

    本地创建了一个project并在GitHub上创建了一个仓库,想要将本地的仓库链接到远程仓库我用的是如下方法:git init    //初始化本地仓库git remote add origin XX ...

  6. [LC]66题 Plus One (加1)

    ①英文题目 Given a non-empty array of digits representing a non-negative integer, plus one to the integer ...

  7. 资深架构师Sum的故事:正则!入门就是这样简单

    | 故事背景 职场如战场!Sum带领三个小队友用了两周,成功把代理功能给干出来了.如果说产品经理是最魔鬼的指挥官,那测试就是最魔鬼的教官.这两周,让Sum深深领略了什么是X市的日出. 不过话又说回来, ...

  8. 人人都懂区块链--pdf电子版学习资料下载

    人人都懂区块链 21天从区块链“小白”到资深玩家电子版pdf下载 链接:https://pan.baidu.com/s/1TWxYv4TLa2UtTgU-HqLECQ 提取码:6gy0 好的学习资料需 ...

  9. 理解Spark运行模式(二)(Yarn Cluster)

    上一篇说到Spark的yarn client运行模式,它与yarn cluster模式的主要区别就是前者Driver是运行在客户端,后者Driver是运行在yarn集群中.yarn client模式一 ...

  10. 【前端知识体系-CSS相关】CSS预处理器

    1.常见的CSS预处理器有哪些? [!NOTE] css预处理器:用一种专门的编程语言,为CSS增加了一些编程的特性,将CSS作为目标生成文件,然后开发者就只要使用这种语言进行编码工作,可以让你的CS ...