通常的某個應用單獨新建一個 project 就能夠了,而後把全部的程序文件都放在裏面,這個能夠知足大部分普通的需求,可是有時候,項目有可能要使用其餘的項目文件,或者引入其餘的靜態庫文件,這個時候 workspace 就派上用場了,workspace 便可以單獨管理多個項目,又能夠經過配置,讓各個項目相互依賴,若是不用 workspace,之前的作法是若是用到其餘項目的文件,要手動 copy 文件到當前的項目,在 workspace 裏這個步驟不須要了。xcode
一、新建 Xcode workspaceiphone
打開 Xcode , 選擇 File -> New -> Workspace , 將 Workspace 命名爲 Test.xcworkspace , 並選擇合適的目錄。編輯器
二、設置編譯文件輸出路徑。ui
打開Xcode-Preferences,選中Location標籤頁,設置Derived Data爲Relative,點擊Advanced進入高級設置,選中Custom,選中Relative to Workspace。這樣,在workspace的Build-Products文件夾下能夠找到編譯生成的目標文件了。spa
三、新建 Static Library 項目日誌
選擇 File -> New -> Project , 項目模板選擇 Cocoa Touch Static Library , 項目名稱命名爲 MyLib.xcodeproj , 注意選中 Use Automatic Reference Counting 。code
Xcode 會在項目中自動生成 MyLib.h 和 MyLib.m 文件, 單擊 MyLib.h 文件, 添加下面的方法定義:遞歸
+ (NSString*)getMyTag;ip
再打開 MyLib.m 文件, 添加剛剛定義兩個文件的實現:get
+ (NSString*)getMyTag{
return @"MyLib";
}
MyLib 項目, 在中間的編輯器窗口中選擇項目的 Target , 選擇 Build Phases 標籤, 展開 Copy Headers 分組, 下面有三個子分組, 分別是 Public 、 Project 與 Private , 將 MyLib.h 拖拽到 Public 分組便可。選中
保存全部文件, 選擇 Product -> Build , 進行編譯, 生成 libMyLib.a 文件, 同時也會自動將 MyLib.h 文件複製到輸出目錄(workspace下的Build-Products文件夾)。
四、使用靜態類庫項目
選擇 File -> New -> Project , 項目模板選擇 iOS -> Application -> Single View Application , 項目名稱命名爲 MyApp , 注意勾選 Use Storyboards 和 Use Automatic Reference Counting 。
建好項目以後, 項目窗口以下如所示:
選中 MyApp 項目, 在選擇項目的目標 (Target) , 選中 Summary 標籤頁下找到 Linked Frameworks and Library 分組選項, 以下圖:
點擊下面的加號按鈕, 將工做區的 libMyLib.a 添加進去。
接下來設置頭文件搜索路徑User Header Search Paths爲$(BUILT_PRODUCTS_DIR),勾選遞歸搜索選項recursive,以下圖。設置完成,便可直接引用頭文件,#import "Mylib.h".
五、配置工程的編譯選項,控制編譯工程之間的依賴關係。
在,MyApp的 scheme manage裏面添加以前創建的lib文件,編譯MyApp的時候,就會先編譯 statib lib的內容,而後再編譯自身工程。
六、如今要先驗證一下對 MyLib 的引用是否正確, 打開 MyApp 項目的 ViewController.m , 添加對 MyLib.h 的引用, 以下圖所示, 並編譯 MyApp , 若是編譯成功, 則表示引用正確。
七、打開 ViewController.m 文件,調用MyLib的靜態方法getMyTag,輸入返回結果,獲得「MyLib「輸出日誌。
Bundle打包和集成
workSpace中的Bundle類型target不能自動引用,須要手動加入子項目中的目標bundle(注意爲workSpace相對路徑)
另一種辦法是使用腳本拷貝到指定目錄,未使用,不作詳述。
頭文件的問題
子項目的.a文件默認放在$(BUILT_PRODUCTS_DIR)下(Debug-iphoneos,Relese-iphoneos),
頭文件默認放在$(BUILT_PRODUCTS_DIR)/include/$(PRODUCT_NAME)目錄下,
這樣頭文件就有兩份,在不一樣的目錄下,都是在*-iphoneos目錄下,而User Head Search Path設置爲$(BUILT_PRODUCTS_DIR),在切換iphonesimulater編譯時,就沒法搜索到頭文件。
(.a文件的引用由workspace自動管理的,沒有這問題)
解決辦法:
一、首先修改頭文件copy路徑,原爲:/include/$(PRODUCT_NAME),修改成:../include/$(PRODUCT_NAME)
二、User Head Search Path設置爲$(BUILD_DIR)/include,勾選recursive循環搜索,Always Search User Path設置爲YES。
OK,這樣就能夠爲所欲爲的選擇iphoneos和iphonesimulater進行構建。