iphone静态库的创建和调用

from: http://www.cocoachina.com/bbs/read.php?tid=103532

论坛上有很多版本的关于iphone静态库的问题,通过自身实践,对基本方法做一些总结。
环境:Xcode 4.2.1  iso SDK 5.0
主工程targets:
Architectures:Standard (armv7)
Base SDK:Lastest iOS(iOS 5.0)
Supported Platforms:iphonesimulator iphoneos
Valid Architectures:armv6 armv7

静态库工程targets:
Architectures:Standard (armv7)
Base SDK:iphoneosimulator$(SDK_VERSION) (-->如果不是这个,要手动修改,不然会出现architecture无效错误)
Supported Platforms:iphonesimulator iphoneos
Valid Architectures:armv6 armv7

一:静态库的创建
S1: 选择cocoa Touch Static Library模版,新建工程。
S2:添加你的类,或者利用项目自动生成的类处理你的逻辑。
S3:  选中你要对外开放的头文件,将Target Membership中设置为public。

S4: 设置安装路径,在你的工程设置里面,找到testlib构建目标,在Build Settings中找到"Installation Directory"一项(可设置的项非常多,建议在搜索框中输入install来快速查找定位),填上“$(BUILT_PRODUCTS_DIR)”,将Skip Install设置为Yes。
     注:$(BUILT_PRODUCTS_DIR)这个环境变量对应的path很深,而且mac对用户隐藏这个path,除非在终端查看。不用管他,最后生成.a成功后,便可通过xcode直接查看,参考S6。
S5: 设置公开头文件的路径,选择target里的Build Settings,找到Public Headers Folder Path一项,设置为:$(TARGET_NAME)
S6:可以执行Build操作了,如果一切顺利,会在Products中看到XXX.a由红变黑了,表示这个文件生成了,点击这个文件可以看到详细信息,如果看不到,就说明哪个设置还是有问题的。
注:成功后,选中xxx.a文件,在右侧的Identity and Type里看到Full Path,最有有个“箭头”标记,点击,便可打开xxx.a文件path。


二:使用静态库
S1:创建主工程,设置依赖关系,在你的工程build phases中,将xxx.a加到link Binary With Libararies中。
注:可以把你的xxx.a文件拷贝到你的住工程目录下,这样方便查找,link Binary With Libararies中点到“+”,选择“Add other”,把xxx.a加入。
S2:   添加静态库的头文件搜索路径,先在Build Settings中,将User Header Search Paths设置为“$(BUILT_PRODUCTS_DIR)”。
然后双击那个显示“<Multiple values>”的地方,弹出一个对话框,把Recursive勾上。
S3:  设置Scheme.勾上那个Archive选项。
S4:在需要用到的静态库的文件中添加:#import "xxx.h",这是静态库文件所开放的头文件。 然后实例化静态库类,调用其方法来进行逻辑处理。
 



/////////////////////////

from:http://www.cnblogs.com/xiaouisme/archive/2011/12/12/2285221.html

1.用垃圾xcode4创建一个work space,然后添加两个工程,一个是编写lib的工程(target是一个静态库),一个是使用这个lib的普通ios程序的工程。
现在可以认为这两个工程是同级别的,没有什么关系,只是被垃圾x4用work space组织到一起,而已。

2.先整这个lib工程,注意以下几个地方:
2-1. 确定你要导出的头文件:


see,当然得选public.
2-2.设置这个lib的安装路径
这个lib工程生辰的产品——静态库——最终被安装到的路径可能取决于垃圾x4的垃圾偏好设置:Locations.因此可能被安装到derived data路径下,也可能由我们的target指定的路径.为了使得在各种情况下都一样,需要把编译设置里的"Installation Directory"设置为"$(BUILT_PRODUCTS_DIR)".这样我们编译出的静态库产品就能在一个确定的位置找到. 这个位置是这个work space里各工程编译产生的产品共同的目录. 同时我们还需要把这个lib工程里编译设置之“Skip Install”项设为"Yes",这样就可以避免lib被意外的安装到“/usr/local/lib”了(试试就知道这个"意外"目录是哪了)。


2-3.设置公共头文件的路径.
就是说光产生lib(*.a文件)不行啊,还需要外部使用的头文件啊,这个头文件的路径要在这里设置一下.
把lib工程编译选项的“Public Headers Folder Path”设为"$(TARGET_NAME)",这样,头文件就处于这个路径了:$(BUILT_PRODUCTS_DIR)/TARGET_NAME/xx.h
记住:这就是使用这个lib的某工程需要用到的外部头文件. 某工程需要“看得到”这个头文件所在路径.才能#include/import "xx.h".

 3.开始整“使用这个lib的普通ios程序的工程”。
也就是2-3提到的“某工程”.
3-1.点击该工程的target,在Build Phases(构建阶段,编译阶段,随便怎么翻译好了)项的“Link Binary With Libraries”添加.弹出个框大概如下:选我们的workspace里面这个lib.

结果就这样了:


3-2.添加静态库的外部头文件的搜索路径.
Build Settings/User Header Search Paths, 添加$(BUILT_PRODUCTS_DIR),选中前面的钩——可递归遍历路径下的子目录.


知道这里为什么"这样"设置吗?因为2-3我们"那样"设置了。
好了,现在本工程可以看到lib的外部头文件路径了,那么在你想用到的地方#include/import "xx.h"就行了.

这里有这么一段话,还是比较重要吧,看看,不翻译了:

When using a static library which includes categories we will also have to add the “-ObjC” flag to the “Other Linker Flags” build setting. This will force the linker to load all objective-c classes and categories from the library. If the library contains only categories “-all_load” or “-force_load” may be needed as well. See Technical Q&A QA1490 for a more detailed explanation of these settings. 

3-3.配置该工程的scheme。
Edit Scheme\Build\Targets下面添加lib.记住把这个lib拖到最上面.




好了。完了。

 

总结一下:其实workspace就相当于VC的解决方案.没错,估计某垃圾产品人员就是参考的VS20XX。偏偏还自以为是的进行了微创新。
上面过程中有一处令人纠结的奇怪之处,据说又是垃圾x4的bug,算了,见惯不怪了.不是什么大事,这里难以描述就不描述了.就是说可能出现生辰的lib是红色的,右键点击find in finder也找不到.其实是有了的.这里还是不描述了.

 

12月14日补充——
以上在垃圾xcode4.2.1上还是可能出现问题,就是上一段话提到的,没想到我栽在这上面欲罢不能了。。最终找到原因了,下面详细说一下:
祝愿xcode4产品经理立马升天 !

是这样的,作为一个穷人,我当然是用模拟器来编译.
看我打开workspace后上方scheme菜单:

 两个工程:AddressBookLib是静态库工程,UserApp是调用此静态库的工程。
两工程都选了iPhone 5.0 Simulator.
把活动工程设为UserApp,与上所示.(UserApp前面打了个钩)
编译(每次编译前我都不得不clean一下,祝愿xcode4产品经理立马升天 !),提示succeeded。可是尼玛,紧接着又提示找不到头文件了!
我已经设置搜索路径了:User Header Search Paths: $(BUILT_PRODUCTS_DIR). 展开看看:

 路径是build/Debug-iphoneos/ 
我现在把build/Products下面的文件全部手动删除,然后编译,哦对了,为了防止添乱,还是老实的clean先吧(以下描述皆为欲编译先clean,祝愿xcode4产品经理立马升天 !).可能出现编译不过了!这次是真不过了,报错提示没有头文件运行也不行!没事儿,我摁住command+B,多摁几次,好了,神气的编译通过了。(祝愿xcode4产品经理立马升天 !不说了。)然后还是会提示一个红error:找不到那个头文件。没事,起码可以运行无误了。

好,看看build/Products下多了哪些东西: /Debug-iphonesimulator/文件夹,里面包含了我的静态库、静态库头文件以及UserApp等。如此看来,一切是正常了。该有的都有,头文件也有. 但是很不幸,看上面的截图,人家要求路径是build/Debug-iphonesos,而不是穷人我的-iphonesimulator!

为了进一步证实我的猜测,再次删除 build/Products下的所有文件,好,把活动工程设为我的静态库,同事选IOS Device,如下图:

 编译静态库。然后再看看build/Products下多了什么:/Debug-iphoneos/文件夹,里面就是静态库以及头文件.
好,立马紧接着把活动工程设回UserApp(注意穷人我把设备重新设为iPhone 5.0 Simulator),编译,O了,什么错都不报了,一切正常。 为什么?因为build/Products下有了/Debug-iphoneos/,里面就是头文件和静态库.

于是,原因找到了, UserApp的User Header Search Paths为$(BUILT_PRODUCTS_DIR),该死的xcode4应该根据选择的是设备还是模拟器来解析BUILT_PRODUCTS_DIR为Debug-iphonesos还是Debug-iphonesimulator!(你可能要疑问中间怎么夹了个Products文件夹啊鬼知道啊)

好,总结一下,以后搞联编,就得在xcode4的淫威下夹着尾巴做人:先选IOS Device编译lib,再选iPhone 5.0 Simulator编译UserApp。(如果能分别设置多好,但是不能,设了就两个都变了)
或者:买个设备,以后都选 IOS Device就没事儿了。
或者:把头文件手动拷贝到UserApp的工程目录下。。。无语了。xcode你有何用。 
(建议用前两种方法。)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值