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

(轉載)iOS開發:xcode4中使用靜態庫和工作區

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

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

更新記錄:

2011年9月29日,完成了初稿。

2011年10月30日,更正了目錄結構,xcode中Location還是使用默認設置纔對。

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看看這個目錄裏有什麼變化。

 

(3)設置公開頭文件的路徑

在英文的那篇博文中說將這裏設置爲“$(TARGET_NAME)”,是指將生成的頭文件放在一個目錄中,在本程序中,會在/build/debug-iphoneos/中生成一個testlib目錄,在這個目錄中有一個文件MyClass.h文件。

targetname

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

lib.a

下面一步非常關鍵:

如果有問題,需要在xcode的系統設置中檢查Locations設置,在xcode的Preferences…->Locations->Build Location裏,選“Place build products in derived data location(recommended)”,設置完成後需重啓xcode才能生效!用xcode的這個默認設置,那個.a文件一直放在一個長長的非常難看的路徑中(/Users/xxx/Library/Developer/Xcode/DerivedData/xxxProgram-dalrvzehhtesxdfqhxixzafvddwe/Build/Products/Debug-iPhoneos),不知道apple爲什麼要這樣做?是爲了支持多個版本的靜態庫?

 

使用靜態庫

加上一個工程,我這裏命名爲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將工程目錄和工作區文件都移到這裏面,然後再重新打開工作區,將這些工程重新添加到工作區中,看起來就舒服多了。

2011年10月30日更正:上面所說的目錄結構還是有問題的,使用xcode在一開始新建出來的默認結構是正確的,雖然一開始看起來不太習慣,但後來發現它的設置思路還是很清楚的。

MyProgram(工作區目錄)
├─Project1(這是一個靜態庫項目)
│  ├─build
│  │  ├─Debug-iphoneos
│  ├─Project1(這實際是一個分組,源程序應該放在這裏)
│  ├─Project1.xcodeproj
│  └─Project1Tests
├─MyProgram.xcworkspace
└─Project2(這是一個iOS項目)
    ├─build
    │  ├─Debug-iphonesimulator
    ├─Project2(這也是一個分組,源程序都在這裏)
    │  ├─iPad
    │  └─iPhone
    └─Project2.xcodeproj

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

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

發佈了20 篇原創文章 · 獲贊 32 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章