iOS動(dòng)態(tài)庫垮庐、靜態(tài)庫及使用場(chǎng)景、方式:http://www.reibang.com/p/4e0fd0214152
iOS開發(fā)中的靜態(tài)庫和動(dòng)態(tài)庫: ?http://www.reibang.com/p/57a63261046e
//轉(zhuǎn)載:https://www.jb51.net/article/210671.htm
iOS 合并 .a 文件嗡午,生成通用靜態(tài)庫:http://www.reibang.com/p/dacf924246fa
合并時(shí)報(bào)錯(cuò)處理: http://www.reibang.com/p/781795e98444
二媳纬、靜態(tài)庫和動(dòng)態(tài)庫的好處
三、iOS里靜態(tài)庫和動(dòng)態(tài)庫形式纹磺?
四帖烘、framework為什么既是靜態(tài)庫又是動(dòng)態(tài)庫?
七乡摹、制作靜態(tài)庫時(shí)的幾點(diǎn)注意:
一役耕、什么是庫?
庫是共享程序代碼的方式聪廉,一般分為靜態(tài)庫和動(dòng)態(tài)庫瞬痘。
靜態(tài)庫:鏈接時(shí)完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝板熊。
動(dòng)態(tài)庫:鏈接時(shí)不復(fù)制框全,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用干签,系統(tǒng)只加載一次津辩,多個(gè)程序共用,節(jié)省內(nèi)存容劳。
二喘沿、靜態(tài)庫和動(dòng)態(tài)庫的好處
使用靜態(tài)庫的好處:
1、模塊化竭贩,分工合作
2蚜印、避免少量改動(dòng)經(jīng)常導(dǎo)致大量的重復(fù)編譯連接
3、也可以重用留量,注意不是共享使用
動(dòng)態(tài)庫使用有如下好處:
1晒哄、使用動(dòng)態(tài)庫,可以將最終可執(zhí)行文件體積縮小
2肪获、使用動(dòng)態(tài)庫,多個(gè)應(yīng)用程序共享內(nèi)存中得同一份庫文件柒傻,節(jié)省資源
3孝赫、使用動(dòng)態(tài)庫,可以不重新編譯連接可執(zhí)行程序的前提下红符,更新動(dòng)態(tài)庫文件達(dá)到更新應(yīng)用程序的目的青柄。
從1可以得出,將整個(gè)應(yīng)用程序分模塊预侯,團(tuán)隊(duì)合作致开,進(jìn)行分工,影響比較小萎馅。
從2可以看出双戳,其實(shí)動(dòng)態(tài)庫應(yīng)該叫共享庫,那么從這個(gè)意義上來說糜芳,蘋果禁止iOS開發(fā)中使用動(dòng)態(tài)庫就可以理解了:
因?yàn)樵诂F(xiàn)在的iPhone飒货,iPodTouch魄衅,iPad上面程序都是單進(jìn)程的,也就是某一時(shí)刻只有一個(gè)進(jìn)程在運(yùn)行塘辅,那么你寫個(gè)共享庫晃虫,
----共享給誰?(你使用的時(shí)候只有你一個(gè)應(yīng)用程序存在扣墩,其他的應(yīng)該被掛起了哲银,即便是可以同時(shí)多個(gè)進(jìn)程運(yùn)行,別人能使用你的共享庫里的東西嗎呻惕?你這個(gè)是給你自己的程序定制的荆责。)
----目前蘋果的AppStore不支持模塊更新,無法更新某個(gè)單獨(dú)文件(除非自己寫一個(gè)更新機(jī)制:有自己的服務(wù)端放置最新動(dòng)態(tài)庫文件)
至于蘋果為啥禁止ios開發(fā)使用動(dòng)態(tài)庫我就猜到上面?zhèn)z原因
三蟆融、iOS里靜態(tài)庫和動(dòng)態(tài)庫形式草巡?
靜態(tài)庫:.a和.framework
動(dòng)態(tài)庫:.dylib和.framework
四、framework為什么既是靜態(tài)庫又是動(dòng)態(tài)庫型酥?
系統(tǒng)的.framework是動(dòng)態(tài)庫山憨,我們自己建立的.framework是靜態(tài)庫。
五弥喉、a與.framework有什么區(qū)別郁竟?
.a是一個(gè)純二進(jìn)制文件,.framework中除了有二進(jìn)制文件之外還有資源文件由境。
.a文件不能直接使用棚亩,至少要有.h文件配合,.framework文件可以直接使用虏杰。
.a + .h + sourceFile = .framework讥蟆。
建議用.framework.
六、為什么要使用靜態(tài)庫纺阔?
方便共享代碼瘸彤,便于合理使用。
實(shí)現(xiàn)iOS程序的模塊化笛钝≈士觯可以把固定的業(yè)務(wù)模塊化成靜態(tài)庫。
和別人分享你的代碼庫玻靡,但不想讓別人看到你代碼的實(shí)現(xiàn)结榄。
開發(fā)第三方sdk的需要。
七囤捻、制作靜態(tài)庫時(shí)的幾點(diǎn)注意:
1 注意理解:無論是.a靜態(tài)庫還.framework靜態(tài)庫臼朗,我們需要的都是二進(jìn)制文件+.h+其它資源文件的形式,不同的是,.a本身就是二進(jìn)制文件依溯,需要我們自己配上.h和其它文件才能使用老厌,而.framework本身已經(jīng)包含了.h和其它文件,可以直接使用黎炉。
2 圖片資源的處理:兩種靜態(tài)庫枝秤,一般都是把圖片文件單獨(dú)的放在一個(gè).bundle文件中,一般.bundle的名字和.a或.framework的名字相同慷嗜。.bundle文件很好弄淀弹,新建一個(gè)文件夾,把它改名為.bundle就可以了庆械,右鍵薇溃,顯示包內(nèi)容可以向其中添加圖片資源。
3 category是我們實(shí)際開發(fā)項(xiàng)目中經(jīng)常用到的缭乘,把category打成靜態(tài)庫是沒有問題的沐序,但是在用這個(gè)靜態(tài)庫的工程中,調(diào)用category中的方法時(shí)會(huì)有找不到該方法的運(yùn)行時(shí)錯(cuò)誤(selector not recognized)堕绩,解決辦法是:在使用靜態(tài)庫的工程中配置other linker flags的值為-ObjC策幼。
4 如果一個(gè)靜態(tài)庫很復(fù)雜,需要暴露的.h比較多的話奴紧,就可以在靜態(tài)庫的內(nèi)部創(chuàng)建一個(gè).h文件(一般這個(gè).h文件的名字和靜態(tài)庫的名字相同)特姐,然后把所有需要暴露出來的.h文件都集中放在這個(gè).h文件中,而那些原本需要暴露的.h都不需要再暴露了黍氮,只需要把.h暴露出來就可以了唐含。
以上就是ios動(dòng)態(tài)庫和靜態(tài)庫的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于ios動(dòng)態(tài)庫和靜態(tài)庫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章沫浆!
知識(shí)儲(chǔ)備:
一.庫(Library)
什么是庫捷枯?
? ? ?庫是程序代碼的集合,是程序共享代碼的一種方式专执。根據(jù)源代碼的公開情況淮捆,庫可以分為開源庫和閉源庫。比如SDWebImage,AFNetworking,等可以看源碼的叫開源庫他炊。閉源庫,不公開源代碼已艰,是經(jīng)過編譯后的二進(jìn)制文件痊末,看不到具體的實(shí)現(xiàn)。閉源庫又可以分為靜態(tài)庫和動(dòng)態(tài)庫哩掺。庫說白了就是一段編譯好的二進(jìn)制代碼凿叠,加上頭文件就可以供別人使用。
二.靜態(tài)庫和動(dòng)態(tài)庫
和多數(shù)人所熟悉的動(dòng)態(tài)語言和靜態(tài)語言一樣,這里的所謂靜態(tài)和動(dòng)態(tài)是相對(duì)編譯期和運(yùn)行期的
存在形式
? ? ?靜態(tài)庫:.a 和 .framework ? ?動(dòng)態(tài)庫: .dylib 和 .framework盒件。 所以很多人誤以為.a就是靜態(tài)庫蹬碧,.framework就是動(dòng)態(tài)庫,不過系統(tǒng)的.framework都是動(dòng)態(tài)庫
靜態(tài)庫和動(dòng)態(tài)庫使用上的區(qū)別
靜態(tài)庫:鏈接時(shí)炒刁,靜態(tài)庫會(huì)被完整地復(fù)制到可執(zhí)行文件中恩沽,被多次使用就有多份冗余拷貝。編譯完成后翔始,庫文件實(shí)際上就沒有作用了罗心,也這是它的優(yōu)勢(shì)。當(dāng)然其缺點(diǎn)也很明顯城瞎,就是會(huì)明顯增大程序的體積渤闷。
動(dòng)態(tài)庫:鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存脖镀,供程序調(diào)用飒箭,系統(tǒng)只加載一次,供多個(gè)程序調(diào)用蜒灰,節(jié)省內(nèi)存弦蹂。由此可見動(dòng)態(tài)庫又可以叫共享庫。注意:ios 8之前蘋果禁止iOS開發(fā)中使用自己創(chuàng)建的動(dòng)態(tài)庫卷员。原因估計(jì)是現(xiàn)在的iPhone盈匾,iPodTouch,iPad上面程序都是單進(jìn)程的毕骡,也就是某一時(shí)刻只有一個(gè)進(jìn)程在運(yùn)行削饵,那么你寫個(gè)共享庫,共享給誰呢未巫?你使用的時(shí)候只有你一個(gè)應(yīng)用程序存在窿撬,其他的應(yīng)該被掛起了,即便是可以同時(shí)多個(gè)進(jìn)程運(yùn)行叙凡,別人能使用你的共享庫里的東西嗎劈伴?但是iOS8之后,出現(xiàn)了Extension握爷,動(dòng)態(tài)庫有了用武之地跛璧,而且swift只支持動(dòng)態(tài)庫的使用,造成這個(gè)原因主要是swift的運(yùn)行庫沒有被包含在iOS系統(tǒng)中新啼,而是會(huì)被打包進(jìn)App中(這也是造成Swift App體積大的原因)追城,靜態(tài)庫會(huì)導(dǎo)致最終的目標(biāo)程序中包含重復(fù)的運(yùn)行庫(這是蘋果自家的解釋)。
Framework
framework實(shí)際上是一種打包方式燥撞,將庫的二進(jìn)制文件座柱,頭文件和有關(guān)的資源文件打包到一起迷帜,方便管理和分發(fā)。.framework文件可以直接扔到程序直接使用色洞。
作者:小生不怕
鏈接:http://www.reibang.com/p/57a63261046e
來源:簡書
著作權(quán)歸作者所有戏锹。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處火诸。
iOS 合并 .a 文件锦针,生成通用靜態(tài)庫
在桌面上面新建文件夾,用來保存導(dǎo)出來的模擬器文件和真機(jī)文件惭蹂;
cd 到當(dāng)前保存的文件目錄伞插,如: cd /users/******/Deskop/sdk.a文件
打開 mac 終端,在終端中輸入以下命令
lipo -create iphoneos/libShouMiPaySDK.a iphonesimulator/libShouMiPaySDK.a -output ShouMiPaySDK.a
其中 iphoneos/libShouMiPaySDK.a 為導(dǎo)出的真機(jī)文件盾碗,
iphonesimulator/libShouMiPaySDK.a 為導(dǎo)出的模擬器文件
-output ShouMiPaySDK.a 為合并之后的通用靜態(tài)庫
需要注意的是當(dāng)編譯.a文件之前媚污,需要將 debug 和 release 設(shè)置為 NO
注意
需要更改 Build Settings-Build Active Architecture Only 設(shè)為 No
Debug:Yes 表示只編譯選中模擬器對(duì)應(yīng)的架構(gòu), No 則為編譯所有模擬器支持的 cup 架構(gòu)(Debug的 Yes 狀態(tài)改為 No 即可)
4人點(diǎn)贊
作者:NapoleonY
鏈接:http://www.reibang.com/p/dacf924246fa
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)廷雅,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處耗美。
Xcode 12打包framework 報(bào)錯(cuò):have the same architectures (arm64) and can't be in the same fat output file
猿逗比關(guān)注
0.4772021.05.12 14:18:29字?jǐn)?shù) 462閱讀 1,771
解決此問題的時(shí)候走了很多彎路,在這就不多說了航缀。
解決方案:
在?Target->BuildSetting->Architectures->Excluded Architectures?中
點(diǎn)擊箭頭展開
點(diǎn)擊右側(cè)加號(hào)商架,添加Any iOS Simulator SDK
在Any iOS Simulator SDK 后面添加arm64
這樣編譯出來的包中就不會(huì)包含arm64了。
模擬器忽略arm64.jpg
針對(duì)這個(gè)問題芥玉,詳細(xì)說明一下:
正常我們打包framework都會(huì)需要支持i386蛇摸、armv7、x86_64灿巧、arm64等赶袄,因?yàn)樾枰瑫r(shí)滿足真機(jī)和模擬器的運(yùn)行。所以我們正常都用將編譯后的framework進(jìn)行合并抠藕,命令行如下:
lipo -create 真機(jī)文件路徑 模擬器文件路徑 -output 真機(jī)文件路徑
文件路徑見圖:
framework工程位置.jpg
framework在Finder位置.jpg
但是Xcode 12以后模擬器編譯生成的framework中也會(huì)包含arm64饿肺,因此在合并的時(shí)候就會(huì)出現(xiàn)have the same architectures (arm64) and can't be in the same fat output file的報(bào)錯(cuò),而我們一開始的方式就能解決這個(gè)問題盾似。
此處補(bǔ)充一個(gè)查看framework包含內(nèi)容的命令:
lipo -info framework路徑
說到這里就會(huì)有別的問題了(可能是跟我換電腦有關(guān))敬辣,換了個(gè)M1的Mac之后編譯的模擬器framework只有arm64了,x86_64的沒有了零院。
此時(shí)需要用到另一個(gè)設(shè)置了溉跃,依然在Target->BuildSetting中,搜索VALID_ARCHS,在這里是描述你編譯時(shí)需要包含哪些架構(gòu)的告抄,在后面添加上x86_64即可撰茎。
添加x86_64.jpg
寫的可能不是太條理,大致的問題就是這么回事玄妈,有不明白的可以留言乾吻。
補(bǔ)充目前為止Apple移動(dòng)設(shè)備默認(rèn)指令集:
armv6:iPhone2G/3G、iPod 1G/2G
armv7:iPhone 3GS/4/4s拟蜻、iPod 3G/4G绎签、iPad 1G/2G/3G、iPad mini
armv7s:iPhone5酝锅、iPhone5c诡必、iPad4
arm64:iPhone5s及以后、iPad Air搔扁、iPad mini2