目录结构。fa为主工程;A/B分别为引入工程。。
1、首先子工程引用子工程
等同于平阶同workSpace下工程之间的调用
(这种调用是不能引入.a库的。否则会提示过多引用错误 file is already being linked…)
比如A调用B
A中headerpath加入B路径;
importB “子工程.h”文件导入
此时编译不会报错。但是如果运行调用B中方法。因为是在b.m中 还需要 #import B的 “子工程.m”相关文件导入
或者在主工程下,引入B.a进入主工程。此时也默认可以找到B包所有内容。。
(总结就是,主调用方需要增加header路径、引入.a包、import .H文件。。;平行工程尽量不要引用.a问价)
2、主工程调用子工程
headerpath加入路径;
添加子工程.a文件
import “子工程.h”文件导入
注意:此时如果不调用附属工程的方法。。则load函数不调用。。。。
如; 主工程Fa 子工程AAA/BBB 不调用方法则不执行A/B load方法。。执行任一方法 则执行load。。。
如果仅仅import而不调用。。则load方法不会调用。。
这是我们设置问题Other Linker Flags中加入-ObjC或者-all_load或者-force_load这样的解决方法
为什么要设置这个参数呢:
ObjC
这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大,因为加载了很多不必要的文件而导致可执行文件变大。但是如果静态库中有类和category的话只有加入这个flag才行,但是Objc也不是万能的,当静态库中只有分类而没有类的时候,Objc就失效了,这就需要使用-all_load或者-force_load了。
-all_load
-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。但是这个参数也有一个弊端,那就是你使用了不止一个静态库文件,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件 这里会有两种方法解决 1:用命令行就行拆包. 2:就是用下面的这个参数
-force_load
这个flag所做的事情跟-all_load其实是一样的,只是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载 .
总结
个人建议ObjC与force_load搭配使用比较好.
包含静态库时候需要在Target的Other linker flags里面加上值:-objC,-all_load,-force_load
对于64位机子和iPhone OS应用
解决方法是使用-all_load 或者 -force_load。
-all_load强迫链接器从它能看见的所有文档中加载所有的对象文件,甚至那些没有OC代码的文档。
-force_load适用于Xcode3.2+版本,它允许finer得到文档加载的控制。每一个-force_load操作必须跟着一个文档路径,文档中的每一个对象文件将会被加载。
-all_load就是会加载静态库文件中的所有成员,
-ObjC就是会加载静态库文件中实现一个类或者分类的所有成员,
-force_load(包的路径)就是会加载指定路径的静态库文件中的所有成员。
3、子工程调用主工程
headerpath加入主工程路径;
直接import文件即可。。。