xcode 編譯靜態庫所要注意

來源:互聯網
上載者:User


一 建立靜態庫
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/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.