亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

xcode 詳解創建靜態庫和動態庫的方法

2020-07-26 02:58:26
字體:
來源:轉載
供稿:網友

xcode 創建靜態庫和動態庫

1、linux中靜態庫和動態庫區別:

庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。

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

動態庫:這類庫的名字一般是libxxx.so;相對于靜態函數庫,動態函數庫在編譯的時候 并沒有被編譯進目標代碼中,你的程序執行到相關函數時才調用該函數庫里的相應函數,因此動態函數庫所產生的可執行文件比較小。由于函數庫沒有被整合進你的程序,而是程序運行時動態的申請并調用,所以程序的運行環境中必須提供相應的庫。動態函數庫的改變并不影響你的程序,所以動態函數庫的升級比較方便。

2、iOS開發中靜態庫和動態庫區別:

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

靜態庫 好處:

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

ii.避免少量改動經常導致大量的重復編譯連接

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

動態庫 好處:

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

ii.使用動態庫,多個應用程序共享內存中得同一份庫文件,節省資源

iii.使用動態庫,可以不重新編譯連接可執行程序的前提下,更新動態庫文件達到更新應用程序的目的。

iv.應用插件化

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

vi.共享可執行文件 在其它大部分平臺上,動態庫都可以用于不同應用間共享,這就大大節省了內存。從目前來看,iOS仍然不允許進程間共享動態庫,即iOS上的動態庫只能是私有的,因為我們仍然不能將動態庫文件放置在除了自身沙盒以外的其它任何地方。 不過iOS8上開放了App Extension功能,可以為一個應用創建插件,這樣主app和插件之間共享動態庫還是可行的。

3、xcode創建靜態庫

打開Xcode, 選擇File ----> New ---> Project。 新建工程。 選擇iOS ----> Framework & Library ---> Cocoa Touch Static Library。 點擊Next。創建工程: image

新增2個類作為我們的一個靜態類文件: image

其中LogLib.h的代碼如下:(作為公開存在) image

LogLib.m實現方法如下,變成靜態庫后該文件隱藏: image

然后選擇真機進行靜態庫的創建:(command + B) image

這個時候會出現如下的錯誤提示: image

按照錯誤的提示得知我們需要在iOS8.1下build需要選擇證書: image

好了,在Product下會存在libStaticLib.a文件: image

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

找到這2個新建的靜態庫文件: image

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

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路徑下找到合體的靜態庫。

將生產的靜態庫及相應的頭文件加入到我們的測試項目中,運行得到: image

完畢.

4、xcode創建動態庫

打開Xcode, 選擇File ----> New ---> Project。 新建工程。 選擇iOS ----> Framework & Library ---> Cocoa Touch Framework。 點擊Next。創建工程: image

命名為DymicLib: image

同樣的添加新的2個類作為測試: image

將頭文件作為公共的頭文件,提供給外部調用: image

運行后變生成了一個動態庫,找到Product下的DymicLib.framework所在的目錄: image

注意這個只是運行壞境下的動態庫(模擬器和真機),下面建立新的TARGETS:命名為CommonDymicLib: image

將之前生成的DymicLib加入到新的CommonDymicLib中: image

CommonDymicLib添加新的腳本來實現模擬器和真機合并: imageimage

腳本如下:

# 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運行: image

找到生成的CommonDymicLib下的動態庫DymicLib.framework: image

在測試項目中將DymicLib.framework加入: image

運行即可!

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

插件實現方式:使用dlopen加載動態庫,動態庫中真正的可執行代碼為DymicLib.framework/DymicLib文件,因此使用dlopen時如果僅僅指定加載動態庫的路徑為DymicLib.framework是沒法成功加載的。將我們創建的動態庫放在我們的服務器,項目上線后再下載這個動態庫到我們的Documents文件夾中,使用如下代碼動態使用動態庫:

#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."); } 

使用  動態庫 中的類:

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区亚洲二区亚洲三区| 97涩涩爰在线观看亚洲| 久久久国产精品视频| 亚洲第一精品久久忘忧草社区| 久久久久久av| 亚洲欧洲日韩国产| 亚洲一区二区三区视频播放| 成人亚洲欧美一区二区三区| 日韩精品小视频| 国产精品吹潮在线观看| 岛国av一区二区在线在线观看| 伊人久久大香线蕉av一区二区| 国产精品99蜜臀久久不卡二区| 久久久极品av| 日韩成人性视频| 欧美国产激情18| 亚洲国产日韩欧美综合久久| 久久精品男人天堂| 成人福利在线视频| 一区二区三区美女xx视频| 久久精品国产亚洲一区二区| 91欧美激情另类亚洲| 亚洲另类xxxx| 久久久久久久色| 日本国产高清不卡| 欧美一级大片在线免费观看| 91免费电影网站| 亚洲一区二区三区成人在线视频精品| 超碰97人人做人人爱少妇| 91在线观看免费网站| 久久久精品免费视频| 国产精品久久久久久av下载红粉| 亚洲第一区第一页| 亚洲精品视频久久| 岛国视频午夜一区免费在线观看| 91国产美女视频| 热久久免费视频精品| 在线性视频日韩欧美| 国产亚洲激情在线| 亚洲国产成人精品女人久久久| 久久伊人免费视频| 国产91精品青草社区| 亚洲人成网站999久久久综合| 不卡在线观看电视剧完整版| 国产精品∨欧美精品v日韩精品| 午夜精品一区二区三区在线播放| 伊人久久久久久久久久久| 日韩在线视频免费观看高清中文| 久久久久久久999精品视频| 国产一区二区丝袜高跟鞋图片| 国产精品成人国产乱一区| 亚洲综合自拍一区| 国产精品久久久久久久久久三级| 国产中文日韩欧美| 亚洲中国色老太| 中文字幕精品国产| 日韩精品欧美激情| 亚洲iv一区二区三区| 欧美日韩另类在线| 91av中文字幕| 国产成人一区二区在线| 国产精品免费电影| 欧美中在线观看| 亚洲男人天堂2019| 日韩欧美在线视频日韩欧美在线视频| 亚洲国产精品嫩草影院久久| 不卡av电影在线观看| 亚洲精品视频网上网址在线观看| 久热在线中文字幕色999舞| 成人激情视频小说免费下载| 日韩欧美在线中文字幕| 国产精品一区二区三| 成人免费看片视频| 欧美综合国产精品久久丁香| 91精品国产高清久久久久久久久| 亚洲天堂av女优| 色婷婷**av毛片一区| 久久亚洲精品国产亚洲老地址| 在线观看欧美日韩国产| 亚洲综合在线中文字幕| 亚洲第五色综合网| 国产精品视频午夜| 国产成人久久久| 麻豆一区二区在线观看| 亚洲一区美女视频在线观看免费| 精品美女久久久久久免费| 国产一区二区av| 日韩精品中文字幕有码专区| 国产精品揄拍一区二区| 在线日韩日本国产亚洲| 亚洲毛茸茸少妇高潮呻吟| 欧美丰满老妇厨房牲生活| 亚洲欧美制服另类日韩| 日韩中文字幕免费看| 久久精品国产免费观看| 亚洲精品国产欧美| 中文字幕无线精品亚洲乱码一区| 久久精品亚洲94久久精品| 国产亚洲一级高清| 亚洲国产精品女人久久久| 亚洲国产另类 国产精品国产免费| 日韩中文字幕视频在线| 亚洲欧美变态国产另类| 欧美成aaa人片免费看| 在线播放国产一区二区三区| 国产亚洲aⅴaaaaaa毛片| 日韩av中文字幕在线播放| 亚洲国产成人精品电影| 国产精品国产自产拍高清av水多| 欧美老少配视频| 国产一区香蕉久久| 精品久久久一区| 欧美成人免费小视频| 亚洲www永久成人夜色| 国产精品日韩一区| 成人免费视频97| 久久免费视频网站| 欧美亚洲国产视频小说| 久久久欧美一区二区| 国产午夜精品美女视频明星a级| 日韩精品免费在线观看| 亚洲美女视频网| 精品久久久久久电影| 亚洲www在线观看| 国产精品福利无圣光在线一区| 精品久久久久久久久国产字幕| 成人在线一区二区| 日韩av一区在线| 日韩中文字幕在线视频播放| 欧美日韩亚洲视频| 91成人精品网站| 亚洲天堂av高清| 国产精品无码专区在线观看| 日韩精品黄色网| 日韩大陆毛片av| 久久国产精品99国产精| 国产91网红主播在线观看| 亚洲国产日韩欧美综合久久| 免费91麻豆精品国产自产在线观看| 日韩极品精品视频免费观看| 成人淫片在线看| 亚洲天堂男人天堂女人天堂| 精品国产一区二区在线| 国产日韩欧美影视| 美女性感视频久久久| 国产精品一区二区久久国产| 国产欧美日韩精品专区| 国产亚洲福利一区| 亚洲欧美国产视频| 91中文在线观看| 欧美性猛交xxxx乱大交| 亚洲精品小视频在线观看| 成人国产亚洲精品a区天堂华泰| 欧美激情视频网| 国产主播在线一区| 奇米四色中文综合久久| 国产精品黄视频| 亚洲精品wwww| 国内精品小视频在线观看| 欧美日韩性视频| 日韩精品视频在线观看网址| 国产精品免费一区豆花| 日韩女在线观看| 欧美又大又粗又长|