WorkSpace And Static Library In Garbage-Xcode4
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你有何用。
(建议用前两种方法。)
参考:http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/#background