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。創立工程:
新增2個類作為我們的一個靜態類文件:
其中LogLib.h的代碼如下:(作為地下存在)
LogLib.m完成辦法如下,變成靜態庫後該文件隱藏:
然後選擇真機停止靜態庫的創立:(command + B)
這個時分會呈現如下的錯誤提示:
依照錯誤的提示得知我們需求在iOS8.1下build需求選擇證書:
好了,在Product
下會存在libStaticLib.a
文件:
這只是真機下的一個靜態庫,異樣選擇模仿器,command + B
,生成模仿器下的靜態庫。
找到這2個新建的靜態庫文件:
辨別用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途徑
下找到合體的靜態庫。
將消費的靜態庫及相應的頭文件參加到我們的測試項目中,運轉失掉:
終了.
4、xcode創立靜態庫
翻開Xcode, 選擇File ----> New ---> Project。 新建工程。 選擇iOS ----> Framework & Library ---> Cocoa Touch Framework。 點擊Next。創立工程:
命名為DymicLib
:
異樣的添加新的2個類作為測試:
將頭文件作為公共的頭文件,提供應內部調用:
運轉後變生成了一個靜態庫,找到Product
下的DymicLib.framework
所在的目錄:
留意這個只是運轉壞境下的靜態庫(模仿器和真機),上面樹立新的TARGETS
:命名為CommonDymicLib
:
將之前生成的DymicLib
參加到新的CommonDymicLib
中:
為CommonDymicLib
添加新的腳原本完成模仿器和真機兼並:
腳本如下:
# 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. # 辨別編譯生成真機和模仿器運用的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命令將其兼並成一個通用framework # 最後將生成的通用framework放置在工程根目錄下新建的Products目錄下 lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}" rm -r "${WRK_DIR}"
選擇iOS Device
運轉:
找到生成的CommonDymicLib
下的靜態庫DymicLib.framework
:
在測試項目中將DymicLib.framework
參加:
運轉即可!
心得:這個時分所謂的靜態庫其實意義就是晉級版的靜態庫,由於靜態庫運用的前提是項目在發布前添加到項目中,這和我們所謂的插件
(即插即用,隨時在自己的服務器上下載一個靜態庫運轉,而不需求重新打包,我們可以選擇在需求的時分再加載靜態庫)完全是兩碼事。
插件
完成方式:運用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"]; }
感激閱讀,希望能協助到大家,謝謝大家對本站的支持!
【xcode 詳解創立靜態庫和靜態庫的辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!