xcode 詳解創(chuàng)建靜態(tài)庫和動(dòng)態(tài)庫的方法
xcode 創(chuàng)建靜態(tài)庫和動(dòng)態(tài)庫
1、linux中靜態(tài)庫和動(dòng)態(tài)庫區(qū)別:
庫從本質(zhì)上來說是一種可執(zhí)行代碼的二進(jìn)制格式
,可以被載入內(nèi)存中執(zhí)行。庫分靜態(tài)庫和動(dòng)態(tài)庫兩種。
靜態(tài)庫:這類庫的名字一般是libxxx.a;利用靜態(tài)函數(shù)庫編譯成的文件比較大,因?yàn)檎麄€(gè)函數(shù)庫的所有數(shù)據(jù)都會(huì)被整合進(jìn)目標(biāo)代碼中,他的優(yōu)點(diǎn)就顯而易見了,即編譯后的執(zhí)行程序不需要外部的函數(shù)庫支持,因?yàn)樗惺褂玫暮瘮?shù)都已經(jīng)被編譯進(jìn)去了。當(dāng)然這也會(huì)成為他的缺點(diǎn),因?yàn)槿绻o態(tài)函數(shù)庫改變了,那么你的程序必須重新編譯。
動(dòng)態(tài)庫:這類庫的名字一般是libxxx.so;相對于靜態(tài)函數(shù)庫,動(dòng)態(tài)函數(shù)庫在編譯的時(shí)候 并沒有被編譯進(jìn)目標(biāo)代碼中,你的程序執(zhí)行到相關(guān)函數(shù)時(shí)才調(diào)用該函數(shù)庫里的相應(yīng)函數(shù),因此動(dòng)態(tài)函數(shù)庫所產(chǎn)生的可執(zhí)行文件比較小。由于函數(shù)庫沒有被整合進(jìn)你的程序,而是程序運(yùn)行時(shí)動(dòng)態(tài)的申請并調(diào)用,所以程序的運(yùn)行環(huán)境中必須提供相應(yīng)的庫。動(dòng)態(tài)函數(shù)庫的改變并不影響你的程序,所以動(dòng)態(tài)函數(shù)庫的升級比較方便。
2、iOS開發(fā)中靜態(tài)庫和動(dòng)態(tài)庫區(qū)別:
靜態(tài)庫和動(dòng)態(tài)庫是相對編譯期和運(yùn)行期的:靜態(tài)庫在程序編譯時(shí)會(huì)被鏈接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要改靜態(tài)庫;而動(dòng)態(tài)庫在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)代碼中,只是在程序運(yùn)行時(shí)才被載入,因?yàn)樵诔绦蜻\(yùn)行期間還需要?jiǎng)討B(tài)庫的存在。
靜態(tài)庫 好處:
i.模塊化,分工合作,提高了代碼的復(fù)用及核心技術(shù)的保密程度
ii.避免少量改動(dòng)經(jīng)常導(dǎo)致大量的重復(fù)編譯連接
iii.也可以重用,注意不是共享使用
動(dòng)態(tài)庫 好處:
i.使用動(dòng)態(tài)庫,可以將最終可執(zhí)行文件體積縮小,將整個(gè)應(yīng)用程序分模塊,團(tuán)隊(duì)合作,進(jìn)行分工,影響比較小
ii.使用動(dòng)態(tài)庫,多個(gè)應(yīng)用程序共享內(nèi)存中得同一份庫文件,節(jié)省資源
iii.使用動(dòng)態(tài)庫,可以不重新編譯連接可執(zhí)行程序的前提下,更新動(dòng)態(tài)庫文件達(dá)到更新應(yīng)用程序的目的。
iv.應(yīng)用插件化
v.軟件版本實(shí)時(shí)模塊升級
vi.共享可執(zhí)行文件 在其它大部分平臺(tái)上,動(dòng)態(tài)庫都可以用于不同應(yīng)用間共享,這就大大節(jié)省了內(nèi)存。從目前來看,iOS仍然不允許進(jìn)程間共享動(dòng)態(tài)庫,即iOS上的動(dòng)態(tài)庫只能是私有的,因?yàn)槲覀內(nèi)匀徊荒軐?dòng)態(tài)庫文件放置在除了自身沙盒以外的其它任何地方。 不過iOS8上開放了App Extension功能,可以為一個(gè)應(yīng)用創(chuàng)建插件,這樣主app和插件之間共享動(dòng)態(tài)庫還是可行的。
3、xcode創(chuàng)建靜態(tài)庫
打開Xcode, 選擇File ----> New ---> Project。 新建工程。 選擇iOS ----> Framework & Library ---> Cocoa Touch Static Library。 點(diǎn)擊Next。創(chuàng)建工程:
新增2個(gè)類作為我們的一個(gè)靜態(tài)類文件:
其中LogLib.h的代碼如下:(作為公開存在)
LogLib.m實(shí)現(xiàn)方法如下,變成靜態(tài)庫后該文件隱藏:
然后選擇真機(jī)進(jìn)行靜態(tài)庫的創(chuàng)建:(command + B)
這個(gè)時(shí)候會(huì)出現(xiàn)如下的錯(cuò)誤提示:
按照錯(cuò)誤的提示得知我們需要在iOS8.1下build需要選擇證書:
好了,在Product
下會(huì)存在libStaticLib.a
文件:
這只是真機(jī)下的一個(gè)靜態(tài)庫,同樣選擇模擬器,command + B
,生成模擬器下的靜態(tài)庫。
找到這2個(gè)新建的靜態(tài)庫文件:
分別用2個(gè).a加入到其他項(xiàng)目在不同運(yùn)行壞境選擇不同的.a靜態(tài)庫明顯不明智,打開終端,輸入以下命令行進(jìn)行整合:
lipo
-create
真機(jī).a路徑
模擬器.a路徑
-output
整合的.a路徑
lipo -create /Users/fangdd/Library/Developer/ Xcode/DerivedData/StaticLib-ercfdooewtvlxmakqvyxkohcagph /Build/Products/Debug-iphoneos/libStaticLib.a /Users/fangdd /Library/Developer/Xcode/DerivedData/StaticLib-ercfdooewtvlxmakqvyxkohcagph /Build/Products/Debug-iphonesimulator/libStaticLib.a -output /Users/fangdd/Desktop/staticLib.a
會(huì)在 整合的.a路徑
下找到合體的靜態(tài)庫。
將生產(chǎn)的靜態(tài)庫及相應(yīng)的頭文件加入到我們的測試項(xiàng)目中,運(yùn)行得到:
完畢.
4、xcode創(chuàng)建動(dòng)態(tài)庫
打開Xcode, 選擇File ----> New ---> Project。 新建工程。 選擇iOS ----> Framework & Library ---> Cocoa Touch Framework。 點(diǎn)擊Next。創(chuàng)建工程:
命名為DymicLib
:
同樣的添加新的2個(gè)類作為測試:
將頭文件作為公共的頭文件,提供給外部調(diào)用:
運(yùn)行后變生成了一個(gè)動(dòng)態(tài)庫,找到Product
下的DymicLib.framework
所在的目錄:
注意這個(gè)只是運(yùn)行壞境下的動(dòng)態(tài)庫(模擬器和真機(jī)),下面建立新的TARGETS
:命名為CommonDymicLib
:
將之前生成的DymicLib
加入到新的CommonDymicLib
中:
為CommonDymicLib
添加新的腳本來實(shí)現(xiàn)模擬器和真機(jī)合并:
腳本如下:
# Sets the target folders and the final framework product. FMK_NAME=${PROJECT_NAME} # Install dir will be the final output to the framework. # The following line create it in the root folder of the current project. INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework # Working dir will be deleted after the framework creation. WRK_DIR=build DEVICE_DIR=${WRK_DIR}/Release-iphoneos/$ {FMK_NAME}.framework SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework # -configuration ${CONFIGURATION} # Clean and Building both architectures. # 分別編譯生成真機(jī)和模擬器使用的framework xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build # Cleaning the oldest. if [ -d "${INSTALL_DIR}" ] then rm -rf "${INSTALL_DIR}" fi mkdir -p "${INSTALL_DIR}" cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/" # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product. # 使用lipo命令將其合并成一個(gè)通用framework # 最后將生成的通用framework放置在工程根目錄下新建的Products目錄下 lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}" rm -r "${WRK_DIR}"
選擇iOS Device
運(yùn)行:
找到生成的CommonDymicLib
下的動(dòng)態(tài)庫DymicLib.framework
:
在測試項(xiàng)目中將DymicLib.framework
加入:
運(yùn)行即可!
心得:這個(gè)時(shí)候所謂的動(dòng)態(tài)庫其實(shí)意義就是升級版的靜態(tài)庫,因?yàn)閯?dòng)態(tài)庫使用的前提是項(xiàng)目在發(fā)布前添加到項(xiàng)目中,這和我們所謂的插件
(即插即用,隨時(shí)在自己的服務(wù)器上下載一個(gè)動(dòng)態(tài)庫運(yùn)行,而不需要重新打包,我們可以選擇在需要的時(shí)候再加載動(dòng)態(tài)庫)完全是兩碼事。
插件
實(shí)現(xiàn)方式:使用dlopen
加載動(dòng)態(tài)庫,動(dòng)態(tài)庫中真正的可執(zhí)行代碼為DymicLib.framework/DymicLib
文件,因此使用dlopen
時(shí)如果僅僅指定加載動(dòng)態(tài)庫的路徑為DymicLib.framework
是沒法成功加載的。將我們創(chuàng)建的動(dòng)態(tài)庫放在我們的服務(wù)器,項(xiàng)目上線后再下載這個(gè)動(dòng)態(tài)庫到我們的Documents
文件夾中,使用如下代碼動(dòng)態(tài)使用動(dòng)態(tài)庫:
#import <dlfcn.h> NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/DymicLib.framework/DymicLib",NSHomeDirectory()]; voidvoid * libHandle = NULL; libHandle = dlopen([documentsPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW); if (libHandle == NULL) { charchar *error = dlerror(); NSLog(@"dlopen error: %s", error); } else { NSLog(@"dlopen load framework success."); }
使用 動(dòng)態(tài)庫 中的類:
Class rootClass = NSClassFromString(@"DymicLog"); if (rootClass) { id object = [[rootClass alloc] init]; [(DymicLog *)object relog:@"hello world"]; }
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Linux動(dòng)態(tài)庫函數(shù)的詳解
- Linux靜態(tài)庫與動(dòng)態(tài)庫實(shí)例詳解
- 詳解dll動(dòng)態(tài)庫的開發(fā)與調(diào)用及文件的讀寫小程序
- android studio2.3如何編譯動(dòng)態(tài)庫的過程詳解
- Linux下g++編譯與使用靜態(tài)庫和動(dòng)態(tài)庫的方法
- Linux環(huán)境g++編譯GDAL動(dòng)態(tài)庫操作方法
- 解決Linux程序編譯鏈接動(dòng)態(tài)庫版本的相關(guān)問題
- 淺談Linux C語言動(dòng)態(tài)庫及靜態(tài)庫
- c++實(shí)現(xiàn)加載so動(dòng)態(tài)庫中的資源
- linux 程序、動(dòng)態(tài)庫、靜態(tài)庫內(nèi)部添加版本號和編譯時(shí)間詳解
- 從源碼編譯Android系統(tǒng)的Java類庫和JNI動(dòng)態(tài)庫的方法
- C#調(diào)用非托管動(dòng)態(tài)庫中的函數(shù)方法
- Visual Studio中根據(jù)系統(tǒng)區(qū)分引用64位、32位DLL動(dòng)態(tài)庫文件的配置方法
- 動(dòng)態(tài)庫調(diào)用靜態(tài)庫示例講解
- linux生成(加載)動(dòng)態(tài)庫靜態(tài)庫和加載示例方法
- 深入探討Linux靜態(tài)庫與動(dòng)態(tài)庫的詳解(一看就懂)
- 分析Windows和Linux動(dòng)態(tài)庫
- 在動(dòng)態(tài)庫和靜態(tài)庫中使用模板(dynamic libraries ,static libraries)
相關(guān)文章
iOS畢業(yè)設(shè)計(jì)之天氣預(yù)報(bào)App
這篇文章主要為大家詳細(xì)介紹了iOS畢業(yè)設(shè)計(jì)之天氣預(yù)報(bào)App,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10iOS省市二級聯(lián)動(dòng)的數(shù)據(jù)組織PHP版
這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)之"省市"二級聯(lián)動(dòng)的數(shù)據(jù)組織PHP版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09IOS開發(fā)之多線程N(yùn)SThiread GCD NSOperation Runloop
這篇文章主要介紹了IOS多線程開發(fā),主要用到NSThiread、GCD、 NSOperation、Runloop,有詳細(xì)的原理解析和實(shí)例代碼,對多線程感興趣的同學(xué),可以參考下2021-04-04解決Alamofire庫在iOS7下設(shè)置Head無效的問題
本文主要介紹Alamofire庫在iOS下設(shè)置Head,這里通過代碼實(shí)例解決不同版本的IOS系統(tǒng)出現(xiàn)的問題,有需要的小伙伴可以參考下2016-07-07