制作.a與 -ObjC,-all_load的作用

1. 使用命令 lipo -info 靜態庫名稱 ?可以查看當前靜態庫支持的架構

2.#合并.a

lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a

3. -ObjC

打包.a當.a中包含category的時候 編譯沒問題但是運行的時候就會報? 下圖的錯誤

錯誤1

這個時候只需要在Other Linker Flags里面加入-ObjC標志就可以避免這個錯誤,這個flag告訴鏈接器把庫中定義的Objective-C類和Category都加載進來。這樣編譯之后的app會變大(因為加載了其他的objc代碼進來)。但是如果靜態庫中有類和category的話只有加入這個flag才行。

4.-all_load

這個flag是專門處理-ObjC的一個Bug.用來-ObjC以后,如果類庫中只有category沒有類的時候,這些category還是加載不進來(這句有點不懂,我打包了個.a只包含UIView+Name 使用-ObjC可以加載出來,去除-ObjC只添加-all_load也可以加載出來,使用-force_load 靜態庫的路徑同樣可以加載出來,莫非是因為工程中只有這個.a的緣故?待后續測試).變通方法就是加入-all_load或者-force_load.-all_load會強制鏈接器把目標文件都加載進來,即使沒有Objc代碼,-force_load在xcode3.2后可用.但是-force_load后面必須跟一個靜態庫的路徑

5 . 使用-ObjC 后,會產生兩個問題 :

1.undefined symbols

2.duplicate symbols

undefined symbols 說明工程中沒有引入第三方引用的庫

如果不加-ObjC 參數,則在編譯時不會出錯,但在運行時用到了沒有引用庫的方法,則系統會崩潰這個問題好解決,只要找到缺的庫,引入工程就可以了

duplicate symbols 的問題就不好解決了,說明第三方庫中的類名和工程中的類名,或其他第三方庫中的類名重名了.

最常見的比如Reachability 這個類.如果第三方庫中引用了,自己的工程中也引用了.就會報duplicate symbols

如果引用的第三方庫沒有源代碼,就只能將自己工程中的重名類重命名了

應對上面的問題,如果自己要制作一個庫的話,要注意兩點:

1.避免對系統類加category 這樣,別人用到你的庫時,不加ObjC參數也可以用你的庫

2.如果庫中用到了其它的第三方的源代碼,尤其是用的比較普遍的,如 Reachability ,一定一定要對這些類重命名,最常見的做法是給類加個前綴,以避免別人用你的庫時,產生duplicate symbols 的問題

鏈接地址:http://www.cnblogs.com/littleBit/p/4872600.html?utm_source=tuicool&utm_medium=referral

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容