xcode如何实现多工程联编

Home / iOS MrLee 2016-5-9 3049

在開發項目時,有時候需要依賴其他的工程(通常是第三方開源的靜態庫工程)。網上有很多第三方開源庫都是以壹個靜態庫工程提供給開發者的(比如Codova, CocoaPods等)。
其次,我們自己可以建壹個這樣的靜態庫工程,專門用來放自己在實際開發中用的比較多的技術,比如壹些幫助類,壹些好的技術封裝等等。這樣在開發新項目時,就可以把這個工程引入進來,要用裏面的功能時就可以直接使用,不用找這個工程copy下,那個工程copy下,最後找不到了就更頭疼。只要我們維護好這個靜態庫工程,以後開發就會省事不少。
好啦,步入正題。如果我們的工程要引入靜態庫工程,如何配置簡單實用,以下是個人在實際開發中使用的方法:
場景1:把依賴工程作爲主工程的壹個子工程, 這種十分簡單,在此不做介紹。 (蘋果官方文檔中有對其的介紹)
場景2:建工作區,把相關的工程導入到工作區下。在工作區下面的工程都是並列關系。
example : 工作區 :MyWorkplace 主工程 : MyApp 依賴庫工程 :MyLib
利用Xcode新建壹個工作區MyWorkplace,會生成壹個MyWorkplace.xcworkspace文件,這就是工作區工程文件,打開該文件,在裏面新建壹個應用程序工程MyApp,新建壹個Static Lib工程MyLib。這樣工作區裏面就有兩個工程,接下來就是配置讓MyApp能夠編譯,使用MyLib。 1.設置兩個工程依賴關系。進入MyApp工程的"MyApp"target的“Build Phase”設置項頁面,展開“Link Binnary With Libraries”選項卡,點擊“+”,選擇“Workspace”中的“libMyLib.a”。此步有兩個作用:壹是設置MyApp的庫依賴,這樣編譯MyApp時,編譯器會自動編譯MyLib工程。二是設置MyApp找尋該靜態庫的搜索路徑,會自動設置“Library Search Paths”,這樣鏈接時,MyApp就知道去哪裏鏈接libMyLib.a文件了。 2.設置頭文件搜索路徑。進入MyLib工程的"MyLib"target的“Build Phase”設置項頁面,添加壹個設置項“Copy Files”,然後選擇“Destination”爲“Products Directory”。Subpath設置成“include”即可,這是指定將那些MyLib中的頭文件copy到“include”中去,也可以自定義這個路徑,接下來我們需要用到這個路徑。進入MyApp工程的"MyApp"target的“Build Settings"頁面,找到“User Header Search Paths”,設置爲“$(BUILT_PRODUCTS_DIR)”,這是爲了讓MyApp能夠找到MyLib公開的頭文件,否則編譯是會找不到頭文件報錯的。 3.如何在static lib中加入資源。通常,在我們的靜態庫工程中,會包含有資源文件,比如images, xib, plist等等,但這些資源文件在編譯過程中是不會加入到.a中的,所以我們需要通過其他的途徑把資源提供給使用者。個人推薦使用bundle,壹來bundle會被編譯,xib文件會成爲二進制文件,這樣外界就無法查看xib的內容,其次也是壹個很好的封裝,很方的插入或刪除資源,這也是目前大多數SDK提供商采用的普通方式。 方法:在MyLib中添加壹個Target,選擇“OS X”下的“Framework & Library”,選擇“Bundle”。進入MyLibBundle的“Build Setting”設置頁面,修改“Base SDK”爲 “Latest iOS(iOS latestversion)”。然後就可以往MYLibBundle裏面加入妳想要的資源了。 在MyLib代碼中要引用MyLibBundle中的資源文件時,需要這樣使用:
#define MyLibBUNDLE_NAME @ "MyLibBundle.bundle"
#define MyLibBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MyLibBUNDLE_NAME]
#define MyLibBUNDLE [NSBundle bundleWithPath: MyLibBUNDLE_PATH]
xib :
self = [super initWithNibName:@"MyLibViewController" bundle:MyLibBUNDLE];
image :
+ (UIImage *)getImageWithName:(NSString *)pImageName {
    return [UIImage imageWithContentsOfFile:[[MyLibBUNDLE resourcePath] stringByAppendingPathComponent:pImageName]];
}

4. 主工程引用静态库工程的资源。 我们上面创建好了MyLibBundle,MyApp已经可以访问MyLib的.a和.h了,现在配置MyApp访问MyLibBundle。本人愚笨,因为时间关系,暂时没有找到一个非常好的办法,但是想出一个方法可以解决这个问题。进入MyApp的“Build Phases”,添加选项“Run Scrip”,添加下述脚本: cp -R ${BUILT_PRODUCTS_DIR}/MyLibBundle.bundle ${BUILT_PRODUCTS_DIR}/${TARGET_NAME}.app MyLibBundle.bundle就是你在MyLib中新建的bundle的target名字。该脚本作用就是把生成的.bundle拷贝到最终生成的.app中,这样.app中就包含了我们MyLib要用到的资源。
5. 做完上述操作,已完成了多工程联编的99%的配置工作。现在我们编译MyApp工程,已经会先编译MyLib,然后一切运行OK,但是运行程序时爆掉了,原因是我们用到了MyLib的UI,但MyLib找不到这个MyLibBundle。原来我们还未联编MyLibBundle这个target。 简单,进入target“MyLib"的“Build Phases”,展开“Target Dependencies”,添加“MyLibBundle”。这样就添加了MyLib的依赖,在编译MyLib时,编译器就会去编译MyLibBundle。好啦,再重新编译,发现已经可以正常运行啦,但是需要告诉广大同胞的是,我们在修改了MyLib的代码时,最好clean一下工程在重新编译,因为xcode的缓存可能导致你刚刚修改的内容尚未编译到.a中。
上述就是个人的一点小小的经验,大家不妨尝试一下,如果有什么更好的方法,欢迎大家赐教。

本文链接:https://www.it72.com/9352.htm

推荐阅读
最新回复 (0)
返回