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. GO 基础学习笔记(1) | 简介

    一.官网查看系列 Golang官网:https://golang.org/ Golang中文网:https://studygolang.com/(推荐) 项目学习网站: https://gowalke ...

  2. MATLAB基本使用及SIMULINK建模仿真实验

    MATLAB基本使用及SIMULINK建模仿真实验 这是我总结的操作方法: 1 )  M脚本文件的编写 1.新建M-file: 2.输入指令: 3.保存(注意:保存路径需要与工作路径一致) 2 )在S ...

  3. 003.Kubernetes二进制部署准备

    一 前置准备 1.1 前置条件 相应的充足资源的Linux服务器: 设置相应的主机名,参考命令: hostnamectl set-hostname k8smaster Mac及UUID唯一: 若未关闭 ...

  4. ios jquery css('left')无法读取属性解决的方法

    ios jquery css('left')无法读取属性解决的方法 <pre>$(this).position().left因为display:none状态下是读取不了 $(this).o ...

  5. C#动态多态性的理解

    C#动态多态性是通过抽象类和虚方法实现的. 抽象类的理解 用关键字abstract创建抽象类,用于提供接口的部分类的实现(理解:接口不能提供实现,抽象类中可以有实现,接口与抽象类一起使用,可以达到父类 ...

  6. rabittmq详解

    交换机(exchange): 声明交换机: Name Durability (消息代理重启后,交换机是否还存在) Auto-delete (当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它) ...

  7. 理解Redis单线程运行模式

    本文首发于:https://mp.weixin.qq.com/s/je4nqCIq6ARhSV2V5Ymmtg 微信公众号:后端技术指南针 0.概述 通过本文将了解到以下内容: Redis服务器采用单 ...

  8. 扛把子组20191121-3 Final阶段贡献分配规则

    此作业的要求参见http://edu.cnblogs.com/campus/nenu/2019fall/homework/10063 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 F ...

  9. 从Netty EventLoop实现上可以学到什么

    本文主要讨论Netty NioEventLoop原理及实践,关于Netty NioEventLoop,首先要知道NioEventLoop是什么,为什么它会是Netty核心Reactor处理器,实现原理 ...

  10. vue通过控制boolean值来决定是否添加class类名

    vue通过控制boolean值来决定是否添加class类名