1. 程式人生 > >手動建立WorkSpace方式的iOS多工程聯合編譯包含Static Library

手動建立WorkSpace方式的iOS多工程聯合編譯包含Static Library

1、建立一個空的App Project

啟動Xcode 點選 File -> New -> Project 選擇 Single View Application新建App專案取名為TestMainApp取專案名字建立成功後關閉專案留待下一步使用

2、建立一個Static Project

啟動Xcode 點選 File -> New -> Project 選擇 Cocoa Touch Static Library建立靜態庫專案取名為TestStaticLibrary,放在跟剛才的TestMainApp專案同一級目錄下

3、建立一個WorkSpace關聯剛才的兩個專案

啟動Xcode 點選 File

 -> New -> WorkSpace 取名為 TestWorkSpace建立WorkSpace建立成功開啟後在左側空空的導航欄中點選右鍵選擇 Add Files to "TestWorkSpace" 選項新增專案到WorkSpace在開啟的目錄中選擇剛剛建立的Project檔案新增到WorkSpace,如圖所示:新增專案到WorkSpace同理新增Static Library專案到WorkSpace, 完成以後是這個樣子的:WorkSpace樣子

4、開始配置專案依賴關係

TestStaticLibrary專案的TestStaticLibrary.h中新增一個方法

#import <Foundation/Foundation.h>

@interface TestStaticLibrary
: NSObject
- (void)sayHello; @end

對應的TestStaticLibrary.m中實現方法體

#import "TestStaticLibrary.h"

@implementation TestStaticLibrary

- (void)sayHello
{
    NSLog(@"Hello! form Static Library Project");
}

@end

下面開始生成靜態庫檔案,選擇要暴露給外部的標頭檔案,選中TestStaticLibrary專案的 Targets TestStaticLibrary在右側的視窗中選擇 Build Phases

 點選左上角的加號選擇New Headers Phase,如圖:新增暴露外部的標頭檔案新增成功以後,展開Headers有三個子分組PublicPrivate 和 Project,直接把 TestStaticLibrary.h 拖到 Public分類下,如圖 :新增暴露標頭檔案再來新增TestMainApp專案對TestStaticLibrary的依賴,選中TestMainApp專案,Target選擇TestMainApp,右側Build Settings分類下,搜尋 User Header Search Paths,新增$(BUILT_PRODUCTS_DIR),勾選遞迴搜尋選項recursive,如下圖設定標頭檔案搜尋路徑然後,按Command + B鍵編譯工程,看到下面紅色的libTestStaticLibrary.a檔案變為黑色。

接著在選擇Build Phases分來,展開Link Binary With Libraries,點選下面的加號,新增停開庫檔案引用,如圖:引用靜態庫檔案點選Add按鈕新增。

最後可以在ViewController.m檔案中,引入靜態庫暴露出來的標頭檔案,TestStaticLibrary.h,然後在viewDidLoad方法中新增如下程式碼進行測試。

- (void)viewDidLoad {
    [super viewDidLoad];
    TestStaticLibrary *test = [[TestStaticLibrary alloc] init];
    [test sayHello];
}

編譯執行專案,可以看到控制檯列印的資訊,證明成功了。執行結果

補充資訊

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,這樣就可以隨心所欲的選擇iphoneosiphonesimulater進行構建。

轉自:http://www.softdevblog.com/2016/03/29/iosduo-gong-cheng-lian-he-bian-yi-bao-han-staticlibrary/