Xcode WorkSpace含靜態庫多項目依賴編譯

通常的某個應用單獨新建一個 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

clip_image001

clip_image002

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 分組便可。clip_image003選中 

保存全部文件, 選擇 Product -> Build , 進行編譯, 生成 libMyLib.a 文件, 同時也會自動將 MyLib.h 文件複製到輸出目錄(workspace下的Build-Products文件夾)。

四、使用靜態類庫項目

選擇 File -> New -> Project , 項目模板選擇 iOS -> Application -> Single View Application , 項目名稱命名爲 MyApp , 注意勾選 Use Storyboards 和 Use Automatic Reference Counting 。

clip_image004

clip_image005

建好項目以後, 項目窗口以下如所示:

clip_image006

選中 MyApp 項目, 在選擇項目的目標 (Target) , 選中 Summary 標籤頁下找到 Linked Frameworks and Library 分組選項, 以下圖:

clip_image008

點擊下面的加號按鈕, 將工做區的 libMyLib.a 添加進去。

clip_image009

接下來設置頭文件搜索路徑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進行構建

相關文章
相關標籤/搜索