1. 使用命令 lipo -info 靜態(tài)庫(kù)名稱 ?可以查看當(dāng)前靜態(tài)庫(kù)支持的架構(gòu)
2.#合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a
3. -ObjC
打包.a當(dāng).a中包含category的時(shí)候 編譯沒(méi)問(wèn)題但是運(yùn)行的時(shí)候就會(huì)報(bào)? 下圖的錯(cuò)誤
這個(gè)時(shí)候只需要在Other Linker Flags里面加入-ObjC標(biāo)志就可以避免這個(gè)錯(cuò)誤,這個(gè)flag告訴鏈接器把庫(kù)中定義的Objective-C類和Category都加載進(jìn)來(lái)。這樣編譯之后的app會(huì)變大(因?yàn)榧虞d了其他的objc代碼進(jìn)來(lái))。但是如果靜態(tài)庫(kù)中有類和category的話只有加入這個(gè)flag才行。
4.-all_load
這個(gè)flag是專門處理-ObjC的一個(gè)Bug.用來(lái)-ObjC以后,如果類庫(kù)中只有category沒(méi)有類的時(shí)候,這些category還是加載不進(jìn)來(lái)(這句有點(diǎn)不懂,我打包了個(gè).a只包含UIView+Name 使用-ObjC可以加載出來(lái),去除-ObjC只添加-all_load也可以加載出來(lái),使用-force_load 靜態(tài)庫(kù)的路徑同樣可以加載出來(lái),莫非是因?yàn)楣こ讨兄挥羞@個(gè).a的緣故?待后續(xù)測(cè)試).變通方法就是加入-all_load或者-force_load.-all_load會(huì)強(qiáng)制鏈接器把目標(biāo)文件都加載進(jìn)來(lái),即使沒(méi)有Objc代碼,-force_load在xcode3.2后可用.但是-force_load后面必須跟一個(gè)靜態(tài)庫(kù)的路徑
5 . 使用-ObjC 后,會(huì)產(chǎn)生兩個(gè)問(wèn)題 :
1.undefined symbols
2.duplicate symbols
undefined symbols 說(shuō)明工程中沒(méi)有引入第三方引用的庫(kù)
如果不加-ObjC 參數(shù),則在編譯時(shí)不會(huì)出錯(cuò),但在運(yùn)行時(shí)用到了沒(méi)有引用庫(kù)的方法,則系統(tǒng)會(huì)崩潰這個(gè)問(wèn)題好解決,只要找到缺的庫(kù),引入工程就可以了
duplicate symbols 的問(wèn)題就不好解決了,說(shuō)明第三方庫(kù)中的類名和工程中的類名,或其他第三方庫(kù)中的類名重名了.
最常見(jiàn)的比如Reachability 這個(gè)類.如果第三方庫(kù)中引用了,自己的工程中也引用了.就會(huì)報(bào)duplicate symbols
如果引用的第三方庫(kù)沒(méi)有源代碼,就只能將自己工程中的重名類重命名了
應(yīng)對(duì)上面的問(wèn)題,如果自己要制作一個(gè)庫(kù)的話,要注意兩點(diǎn):
1.避免對(duì)系統(tǒng)類加category 這樣,別人用到你的庫(kù)時(shí),不加ObjC參數(shù)也可以用你的庫(kù)
2.如果庫(kù)中用到了其它的第三方的源代碼,尤其是用的比較普遍的,如 Reachability ,一定一定要對(duì)這些類重命名,最常見(jiàn)的做法是給類加個(gè)前綴,以避免別人用你的庫(kù)時(shí),產(chǎn)生duplicate symbols 的問(wèn)題
鏈接地址:http://www.cnblogs.com/littleBit/p/4872600.html?utm_source=tuicool&utm_medium=referral