1. 使用命令 lipo -info 靜態庫名稱 ?可以查看當前靜態庫支持的架構
2.#合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a
3. -ObjC
打包.a當.a中包含category的時候 編譯沒問題但是運行的時候就會報? 下圖的錯誤
這個時候只需要在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