Xcode4中使用靜態庫
Xcode4中使用靜態庫
1. 創建一個工作區:".xcworkspace"
2. 將項目添加到工作區(新建/添加現有項目)
3. 向應用程序target添加靜態庫,從Workspace
4. 打開 “Build Settings” 標簽,設置 “User Header Search Paths” 項的值為 “$(BUILT_PRODUCTS_DIR)”,并選中“Recursive”框
5. 設置“Other Linker Flags”項的值為“-ObjC”
6. 打開scheme,設置build順序,將靜態庫添加進來,并放在程序前面
7. 從靜態庫項目中拖動公共頭文件到應用程序項目,這些頭文件不需要被包括在target中
創建靜態庫
1. 將所有需要公開的頭文件在“Target Membership”中將其設置為“public”
2. 打開 “Build Settings” ,設置“Installation Directory”的值為“$(BUILT_PRODUCTS_DIR)”;并設置“Skip Install”的值為“Yes”
3. 設置“Public Headers Folder Path”的值為 “$(TARGET_NAME)”
.然后 Edit Scheme pane (Product > Edit Scheme), change its build configuration to Release,這樣就產生一個release模式的靜態庫,注意release和debug模式的靜態庫是有區別,如果在引用并把這個模式調錯,就會報出“ignoring file /Users/laiqiangzhuo/Desktop/TestLibary/TestLibary/libLibary.a, missing required architecture i386 in file“的錯誤
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。
構建目標(Target):構建目標指定了一系列的編譯和連接設置,對于靜態庫就是生成一個.a文件。
還有一個group不知道是什么概念,因為在文件的location屬性中有個“Relative to Group”設置。
這些一大堆概念到現在還只是略知一二,后面用的多了會理解慢慢深刻一些吧。
生成靜態庫
在新建工程時,需要選擇“cocoa Touch Static Library”這個模板,
一陣子Next后,可以建出一個工程,我這里取名為testlib。為了測試,我建了一個類MyClass,生成MyClass.h和MyClass.m兩個文件。
(1)公開頭文件
要選中.h文件,將Target Membership中設置為public。
(2)設置安裝路徑
在testlib的工程設置里面,找到testlib構建目標,在Build Settings中找到"Installation Directory"一項(可設置的項非常多,建議在搜索框中輸入install來快速查找定位),填上“$(BUILT_PRODUCTS_DIR)”,將Skip Install設置為Yes。
$(BUILT_PRODUCTS_DIR)這個環境變量在工作區的build/debug-iphoneos路徑下,最好在構建的過程中去打開Finder看看這個目錄里有什么變化。
下圖的這個目錄層次結構也非常重要,我把工作區和工程調整成下面這種結構了。
(3)設置公開頭文件的路徑
在英文的那篇博文中說將這里設置為“$(TARGET_NAME)”,是指將生成的頭文件放在一個目錄中,在本程序中,會在/build/debug-iphoneos/中生成一個testlib目錄,在這個目錄中有一個文件MyClass.h文件。
設置完成前面的三步,可以執行Build操作了,如果一切順利,會在Products中看到libtestlib.a由紅變黑了,表示這個文件生成了,點擊這個文件可以看到詳細信息,如果看不到,就說明哪個設置還是有問題的。
下面一步非常關鍵:
如果有問題,需要在xcode的系統設置中把Locati*****設置一下,如下圖,設置完成后需重啟xcode才能生效!我用xcode的默認設置,那個.a文件一直放在一個長長的非常難看的路徑中,不知道apple為什么要這樣做?是為了支持多個版本的靜態庫?
使用靜態庫
加上一個工程,我這里命名為mainprog,讓它依賴testlib,我在主程序中加了一條#import "MyClass.h"語句,只要這條語句能夠編譯,整個工作區和工程應該設置的就沒問題了。
(1)設置依賴關系
在mainprog工程的build phases中,將libtestlib.a加到link Binary With Libraries中。
(2)添加靜態庫的頭文件搜索路徑
這一步最迷惑人了,先在Build Settings中,將User Header Search Paths設置為“$(BUILT_PRODUCTS_DIR)”。
然后雙擊那個顯示“<Multiple values>”的地方,彈出一個對話框(這個窗口隱藏的相當深,我找了足足半天才發現,一開始還以為我的xcode版本有點低呢),把Recursive勾上。
(3)設置Scheme
加上了依賴關系,按照以前VisualStudio的習慣,整個構建過程應該按照這些依賴關系的順序來構建了吧,可發現xcode現在還沒有這么聰明,需要再設置一下scheme,據說(從apple的xcode文檔中查的)勾上那個Archive非常重要。
(4)讓自動完成功能正常
待完成。
全部步驟完成了,選擇mainprog的scheme,應該能夠構建成功了!
補充一下:
那個目錄結構也非常重要,用xcode建的工程會多產生出一級目錄來,我建一個MyProduct目錄,用Finder將工程目錄和工作區文件都移到這里面,然后再重新打開工作區,將這些工程重新添加到工作區中,看起來就舒服多了。