国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

xcode 詳解創(chuàng)建靜態(tài)庫和動態(tài)庫的方法

2019-10-21 18:48:58
字體:
供稿:網(wǎng)友

xcode 創(chuàng)建靜態(tài)庫和動態(tài)庫

1、linux中靜態(tài)庫和動態(tài)庫區(qū)別:

庫從本質(zhì)上來說是一種可執(zhí)行代碼的二進制格式,可以被載入內(nèi)存中執(zhí)行。庫分靜態(tài)庫和動態(tài)庫兩種。

靜態(tài)庫:這類庫的名字一般是libxxx.a;利用靜態(tài)函數(shù)庫編譯成的文件比較大,因為整個函數(shù)庫的所有數(shù)據(jù)都會被整合進目標(biāo)代碼中,他的優(yōu)點就顯而易見了,即編譯后的執(zhí)行程序不需要外部的函數(shù)庫支持,因為所有使用的函數(shù)都已經(jīng)被編譯進去了。當(dāng)然這也會成為他的缺點,因為如果靜態(tài)函數(shù)庫改變了,那么你的程序必須重新編譯。

動態(tài)庫:這類庫的名字一般是libxxx.so;相對于靜態(tài)函數(shù)庫,動態(tài)函數(shù)庫在編譯的時候 并沒有被編譯進目標(biāo)代碼中,你的程序執(zhí)行到相關(guān)函數(shù)時才調(diào)用該函數(shù)庫里的相應(yīng)函數(shù),因此動態(tài)函數(shù)庫所產(chǎn)生的可執(zhí)行文件比較小。由于函數(shù)庫沒有被整合進你的程序,而是程序運行時動態(tài)的申請并調(diào)用,所以程序的運行環(huán)境中必須提供相應(yīng)的庫。動態(tài)函數(shù)庫的改變并不影響你的程序,所以動態(tài)函數(shù)庫的升級比較方便。

2、iOS開發(fā)中靜態(tài)庫和動態(tài)庫區(qū)別:

靜態(tài)庫和動態(tài)庫是相對編譯期和運行期的:靜態(tài)庫在程序編譯時會被鏈接到目標(biāo)代碼中,程序運行時將不再需要改靜態(tài)庫;而動態(tài)庫在程序編譯時并不會被鏈接到目標(biāo)代碼中,只是在程序運行時才被載入,因為在程序運行期間還需要動態(tài)庫的存在。

靜態(tài)庫 好處:

i.模塊化,分工合作,提高了代碼的復(fù)用及核心技術(shù)的保密程度

ii.避免少量改動經(jīng)常導(dǎo)致大量的重復(fù)編譯連接

iii.也可以重用,注意不是共享使用

動態(tài)庫 好處:

i.使用動態(tài)庫,可以將最終可執(zhí)行文件體積縮小,將整個應(yīng)用程序分模塊,團隊合作,進行分工,影響比較小

ii.使用動態(tài)庫,多個應(yīng)用程序共享內(nèi)存中得同一份庫文件,節(jié)省資源

iii.使用動態(tài)庫,可以不重新編譯連接可執(zhí)行程序的前提下,更新動態(tài)庫文件達(dá)到更新應(yīng)用程序的目的。

iv.應(yīng)用插件化

v.軟件版本實時模塊升級

vi.共享可執(zhí)行文件 在其它大部分平臺上,動態(tài)庫都可以用于不同應(yīng)用間共享,這就大大節(jié)省了內(nèi)存。從目前來看,iOS仍然不允許進程間共享動態(tài)庫,即iOS上的動態(tài)庫只能是私有的,因為我們?nèi)匀徊荒軐討B(tài)庫文件放置在除了自身沙盒以外的其它任何地方。 不過iOS8上開放了App Extension功能,可以為一個應(yīng)用創(chuàng)建插件,這樣主app和插件之間共享動態(tài)庫還是可行的。

3、xcode創(chuàng)建靜態(tài)庫

打開Xcode, 選擇File ----> New ---> Project。 新建工程。 選擇iOS ----> Framework & Library ---> Cocoa Touch Static Library。 點擊Next。創(chuàng)建工程:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

新增2個類作為我們的一個靜態(tài)類文件:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

其中LogLib.h的代碼如下:(作為公開存在)  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

LogLib.m實現(xiàn)方法如下,變成靜態(tài)庫后該文件隱藏:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

然后選擇真機進行靜態(tài)庫的創(chuàng)建:(command + B)  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

這個時候會出現(xiàn)如下的錯誤提示:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

按照錯誤的提示得知我們需要在iOS8.1下build需要選擇證書:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

好了,在Product下會存在libStaticLib.a文件:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

這只是真機下的一個靜態(tài)庫,同樣選擇模擬器,command + B,生成模擬器下的靜態(tài)庫。

找到這2個新建的靜態(tài)庫文件:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

分別用2個.a加入到其他項目在不同運行壞境選擇不同的.a靜態(tài)庫明顯不明智,打開終端,輸入以下命令行進行整合:

lipo -create 真機.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

會在 整合的.a路徑下找到合體的靜態(tài)庫。

將生產(chǎn)的靜態(tài)庫及相應(yīng)的頭文件加入到我們的測試項目中,運行得到:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

完畢.

4、xcode創(chuàng)建動態(tài)庫

打開Xcode, 選擇File ----> New ---> Project。 新建工程。 選擇iOS ----> Framework & Library ---> Cocoa Touch Framework。 點擊Next。創(chuàng)建工程:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

命名為DymicLib:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

同樣的添加新的2個類作為測試:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

將頭文件作為公共的頭文件,提供給外部調(diào)用:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

運行后變生成了一個動態(tài)庫,找到Product下的DymicLib.framework所在的目錄:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

注意這個只是運行壞境下的動態(tài)庫(模擬器和真機),下面建立新的TARGETS:命名為CommonDymicLib:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

將之前生成的DymicLib加入到新的CommonDymicLib中:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

CommonDymicLib添加新的腳本來實現(xiàn)模擬器和真機合并:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解 xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

腳本如下:

# 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=buildDEVICE_DIR=${WRK_DIR}/Release-iphoneos/$ {FMK_NAME}.frameworkSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework# -configuration ${CONFIGURATION}# Clean and Building both architectures.# 分別編譯生成真機和模擬器使用的frameworkxcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean buildxcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build# Cleaning the oldest.if [ -d "${INSTALL_DIR}" ]thenrm -rf "${INSTALL_DIR}"fimkdir -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命令將其合并成一個通用framework# 最后將生成的通用framework放置在工程根目錄下新建的Products目錄下lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"rm -r "${WRK_DIR}"

 

選擇iOS Device運行: xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

找到生成的CommonDymicLib下的動態(tài)庫DymicLib.framework:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

在測試項目中將DymicLib.framework加入:  xcode,創(chuàng)建靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的創(chuàng)建,靜態(tài)庫和動態(tài)庫創(chuàng)建詳解

運行即可!

心得:這個時候所謂的動態(tài)庫其實意義就是升級版的靜態(tài)庫,因為動態(tài)庫使用的前提是項目在發(fā)布前添加到項目中,這和我們所謂的插件(即插即用,隨時在自己的服務(wù)器上下載一個動態(tài)庫運行,而不需要重新打包,我們可以選擇在需要的時候再加載動態(tài)庫)完全是兩碼事。

插件實現(xiàn)方式:使用dlopen加載動態(tài)庫,動態(tài)庫中真正的可執(zhí)行代碼為DymicLib.framework/DymicLib文件,因此使用dlopen時如果僅僅指定加載動態(tài)庫的路徑為DymicLib.framework是沒法成功加載的。將我們創(chuàng)建的動態(tài)庫放在我們的服務(wù)器,項目上線后再下載這個動態(tài)庫到我們的Documents文件夾中,使用如下代碼動態(tài)使用動態(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."); } 

使用  動態(tài)庫 中的類:

Class rootClass = NSClassFromString(@"DymicLog"); if (rootClass) {  id object = [[rootClass alloc] init];  [(DymicLog *)object relog:@"hello world"]; } 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 垫江县| 华容县| 桓仁| 通江县| 牙克石市| 呼和浩特市| 石家庄市| 乌拉特中旗| 类乌齐县| 崇州市| 长葛市| 孟连| 奈曼旗| 阳朔县| 蒲江县| 公主岭市| 遂川县| 晋州市| 麻江县| 瑞安市| 锡林浩特市| 玛曲县| 肇州县| 金寨县| 大方县| 沽源县| 台前县| 固镇县| 武冈市| 永安市| 灌云县| 赤水市| 信丰县| 六安市| 许昌市| 太仆寺旗| 曲阜市| 通城县| 松原市| 瑞昌市| 武隆县|