1. 程式人生 > >iOS開發:xcode4中使用靜態庫和工作區

iOS開發:xcode4中使用靜態庫和工作區

在xcode4中,為了將一些比較獨立的功能封裝起來,或者多人同時開發時,需要將程式打包成靜態庫,但在xcode4中設定工作區、工程和靜態庫等遇到了一系列問題,不知道是不是xcode的高版本中已經解決了這些問題?我用的是xcode4.0(4A304a), SDK是4.3。

從網上能夠查到的寫的比較全面的使用和建立靜態庫的文章是CarbonFive的這篇文章。但我按照這個文章逐個試驗後,發現幾個地方跑不通,經過一番嘗試,終於在我的機器上把詳細的設定步驟跑通了。

xcode4中的幾個基本概念

工作區(Workspace):在xcode4中引入了這個概念,能夠把project統一管理起來,這功能在VisualStudio中是很早就有的功能。

工程(Project):工作區裡管理著一些工程,相關的源程式和資源都在這裡面。

Scheme:這個概念取代了xcode3中的Active Target, Build Configuration, and Executable settings,具體含義不太瞭解,但只知道它執行了一組build動作,在xcode的頂端工具條上可以快速切換不同的scheme。

xcode_scheme

構建目標(Target):構建目標指定了一系列的編譯和連線設定,對於靜態庫就是生成一個.a檔案。

還有一個group不知道是什麼概念,因為在檔案的location屬性中有個“Relative to Group”設定。

這些一大堆概念到現在還只是略知一二,後面用的多了會理解慢慢深刻一些吧。

生成靜態庫

在新建工程時,需要選擇“cocoa Touch Static Library”這個模板,

template_static

一陣子Next後,可以建出一個工程,我這裡取名為testlib。為了測試,我建了一個類MyClass,生成MyClass.h和MyClass.m兩個檔案。

(1)公開標頭檔案

要選中.h檔案,將Target Membership中設定為public。

publicheader[5]

(2)設定安裝路徑

在testlib的工程設定裡面,找到testlib構建目標,在Build Settings中找到"Installation Directory"一項(可設定的項非常多,建議在搜尋框中輸入install來快速查詢定位),填上“$(BUILT_PRODUCTS_DIR)”,將Skip Install設定為Yes。

installDir

$(BUILT_PRODUCTS_DIR)這個環境變數在工作區的build/debug-iphoneos路徑下,最好在構建的過程中去開啟Finder看看這個目錄裡有什麼變化。

下圖的這個目錄層次結構也非常重要,我把工作區和工程調整成下面這種結構了。

productsdir

(3)設定公開標頭檔案的路徑

在英文的那篇博文中說將這裡設定為“$(TARGET_NAME)”,是指將生成的標頭檔案放在一個目錄中,在本程式中,會在/build/debug-iphoneos/中生成一個testlib目錄,在這個目錄中有一個檔案MyClass.h檔案。

targetname

設定完成前面的三步,可以執行Build操作了,如果一切順利,會在Products中看到libtestlib.a由紅變黑了,表示這個檔案生成了,點選這個檔案可以看到詳細資訊,如果看不到,就說明哪個設定還是有問題的。

lib.a

下面一步非常關鍵:

如果有問題,需要在xcode的系統設定中把Locations設定一下,如下圖,設定完成後需重啟xcode才能生效!我用xcode的預設設定,那個.a檔案一直放在一個長長的非常難看的路徑中,不知道apple為什麼要這樣做?是為了支援多個版本的靜態庫?

xcode_loc 

使用靜態庫

加上一個工程,我這裡命名為mainprog,讓它依賴testlib,我在主程式中加了一條#import "MyClass.h"語句,只要這條語句能夠編譯,整個工作區和工程應該設定的就沒問題了。

(1)設定依賴關係

在mainprog工程的build phases中,將libtestlib.a加到link Binary With Libraries中。

link

chooselib

(2)新增靜態庫的標頭檔案搜尋路徑

這一步最迷惑人了,先在Build Settings中,將User Header Search Paths設定為“$(BUILT_PRODUCTS_DIR)”。

userheader

然後雙擊那個顯示“<Multiple values>”的地方,彈出一個對話方塊(這個視窗隱藏的相當深,我找了足足半天才發現,一開始還以為我的xcode版本有點低呢),把Recursive勾上。

recursive

(3)設定Scheme

加上了依賴關係,按照以前VisualStudio的習慣,整個構建過程應該按照這些依賴關係的順序來構建了吧,可發現xcode現在還沒有這麼聰明,需要再設定一下scheme,據說(從apple的xcode文件中查的)勾上那個Archive非常重要。

scheme_setting

(4)讓自動完成功能正常

待完成。

全部步驟完成了,選擇mainprog的scheme,應該能夠構建成功了!

補充一下:

那個目錄結構也非常重要,用xcode建的工程會多產生出一級目錄來,我建一個MyProduct目錄,用Finder將工程目錄和工作區檔案都移到這裡面,然後再重新開啟工作區,將這些工程重新新增到工作區中,看起來就舒服多了。

雖然探索的過程非常艱苦,還得感謝國外的那個程式設計師CarbonFive,那篇文章給出了關鍵的步驟。

------------------------------------------------------------