一 建立靜態庫
1. 產生靜態庫工程
2. release/debug 的選擇 scheme
3. 編譯(注意真機與模擬器的產物)==》
lipo -create 【源檔案路徑1】 【源檔案路徑2】 -output 【目標檔案】
二 使用
1. 插入.h(標頭檔引用,靜態庫不自包含標頭檔)和.a檔案(靜態庫)
三 如果是再workspace中進行連編調試,補充如下
靜態庫工程(build setting)設定
1) 產生產品的路徑
1.1 Installation Directory 設為 $(BUILT_PRODUCTS_DIR) //產生產品的路徑
1.2 Skip Install 改為 yes
2) 設定公開的標頭檔
要選中.h檔案,將Target Membership中設定為public。
3) 設定公開標頭檔的路徑
public headers folfer path 設為 $(TARGET_NAME) //項目名作為標頭檔存放路徑
使用工程設定
1) 添加靜態庫的標頭檔搜尋路徑
將User Header Search Paths設定為“$(BUILT_PRODUCTS_DIR)“ //其實這個工作區的產品都在一個共同的根目錄下
2) 設定scheme依賴關係
3) 如果要單獨使用,拷貝出標頭檔即可。
四 注意事項
1. 如果靜態庫中存在Objective-C風格的類檔案,需要在build-setting中的Other linker flags中加上-ObjC,如果存在Category,還應加上-all_load或-force_load。
2. 隱藏靜態庫代碼
直接刪除靜態庫中的原始碼,只提交連結庫檔案(.a),這樣原項目仍然可以編譯執行。
五 XCode項目中添加靜態庫的方法 右擊target,選擇add -> newtarget 在彈出的 NewTarget 介面中選擇Cocoa Touch -> StaticLibrary ,為新 library 取個名字。 將源檔案添加到這個庫。可以直接拖動現存源檔案,也可以右擊 -> add。注意選擇建立的庫為添加的 target 。 設定原項目,令其使用建立的庫。 (設定源檔案不參加編譯) 編譯建立的靜態庫以產生 .a 檔案。(右擊靜態庫的 target ,選擇build) 編譯原項目,若可以調用靜態庫中的方法則添加成功。
網上有很多關於xcode製作第三方庫的教程,我就不再記錄,這裡說一說我在製作靜態庫中遇到的問題,以及解決辦法。
問題一: 靜態庫.a檔案始終為紅色,顯示編譯不成功。
解決辦法:這是xcode的一個bug,先將編譯模式設定為device,編譯成功,再切換回simulator模式即可編譯simulator對應的.a檔案,路徑為 /Users/${user_name}/Library/Developer/Xcode/DerivedData/${product_name} -aurdmbdevpxznmgvgvihwjqairej/Build/Products/Debug-iphonesimulator /libxxx.a 真機對應的.a檔案在Debug-iphoneos /libxxx.a
問題二:靜態庫中使用了category擴充,引用靜態庫的工程找不到擴充的方法,報錯
原因:這也是xcode的bug。。 Objective-C不會為每一個objc函數產生連結符號,而是會為每一個類產生連結符號。通過category對一個已有的類進行擴充,那麼連結器就不知道如何把原代碼與category的代碼實現關聯起來,導致產生的對象無法響應屬於category的訊息。
解決辦法:1、build settings中的Other Linker Flags添加-Objc選項。這個選項會促使連結器載入庫中所有定義了Class和Category的檔案。但這些額外的代碼會使目標檔案變大。但在64位和iOS應用程式中,linker有一個bug,這個bug會導致objc選項無效,無法從靜態庫中載入只定義了Category的檔案 ,這就需要添加-all_load或-force_load選項。
2、網上搜了一圈,說還有更好的辦法解決,來自於Three20的原始碼。解決辦法如下:
/** * Add this macro before each category implementation, so we don't have to use * -all_load or -force_load to load object files from static libraries that only contain * categories and no classes. * See http://developer.apple.com/library/mac/#qa/qa2006/qa1490.html for more info. */
#define TT_FIX_CATEGORY_BUG(name) @interface TT_FIX_CATEGORY_BUG_##name @end \ @implementation TT_FIX_CATEGORY_BUG_##name @end 意思是定義一個空的class,使得包含該空class的檔案能被載入,我試了試,仍然報錯。。。只有先使用 -force_load了 摘自;http://blog.csdn.net/sclzcq/article/details/8330837
升級到Xcode4.5之後,新增了iPhone5的armv7s支援,但是去除了armv6的支援,也就是說用XCode4.5無論如何設定項目都是無法編譯出能在iPhone3G、iTouch2上面啟動並執行程式或者庫檔案的, 參見《 xcode4.5下編譯出包含armv6架構的靜態庫 》:http://blog.yorkgu.me/2012/10/17/build-static-libs-for-armv6-with-xcode-4-5/