在開發項目時,有時候需要依賴其他的工程(通常是第三方開源的靜態庫工程)。網上有很多第三方開源庫都是以壹個靜態庫工程提供給開發者的(比如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中的資源文件時,需要這樣使用:
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中。
上述就是个人的一点小小的经验,大家不妨尝试一下,如果有什么更好的方法,欢迎大家赐教。
其次,我們自己可以建壹個這樣的靜態庫工程,專門用來放自己在實際開發中用的比較多的技術,比如壹些幫助類,壹些好的技術封裝等等。這樣在開發新項目時,就可以把這個工程引入進來,要用裏面的功能時就可以直接使用,不用找這個工程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]]; }
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2305
- 用户1336
- 访客11455538
每日一句
Talent without working hard is nothing.
没有努力,天份不代表什么。
没有努力,天份不代表什么。
MySQL 数据库优化
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
免ROOT实现模拟点击任意位置
Mobaxterm终端神器
CreateProcessW要注意的细节问题
Autonomous NAT Traversal
【教程】win10 彻底卸载edge浏览器
eclipse工程基于Xposed的一个简单Hook
排名前5的开源在线机器学习
Mac OS最简单及(Karabiner)快捷键设置
发一款C++编写的麻将
VMware NAT端口映射外网访问虚拟机linux
独家发布最新可用My-AutoPost——wordpress 采集器
新会员