Xcode創(chuàng)建自己的靜態(tài)庫 .a和 .Framework

對于程序員來說,“庫”是一個很常見的東西,比如在調(diào)用系統(tǒng)API時,可以看到這些都是封裝在.Framework的動態(tài)庫中,然后供我們使用的,而且在第三方平臺提供的一些SDK也是打包成靜態(tài)庫的,那么問題來了,在開發(fā)中到底什么才是“庫”,又怎樣創(chuàng)建屬于自己的靜態(tài)庫呢?這就來簡單介紹一下庫以及創(chuàng)建靜態(tài)庫的方法:

A ->庫的簡單介紹

一、什么是庫?

庫是共享程序代碼的方式,一般分為靜態(tài)庫和動態(tài)庫。

二、靜態(tài)庫與動態(tài)庫的區(qū)別?

靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝。
動態(tài)庫:鏈接時不復(fù)制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個程序共用,節(jié)省內(nèi)存。

三、iOS里靜態(tài)庫形式?

.a和.framework

四、iOS里動態(tài)庫形式?

.dylib和.framework 【iOS8之前個人打包動態(tài)庫無法通過上架審核,但是在iOS8以后可以支持“Embed Frameworks”功能,你也可以把你的動態(tài)庫嵌入到APP中使用】

五、framework為什么既是靜態(tài)庫又是動態(tài)庫?

系統(tǒng)的.framework是動態(tài)庫,我們自己建立的.framework是靜態(tài)庫。

六、a與.framework有什么區(qū)別?

.a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework。
建議用.framework.

七、為什么要使用靜態(tài)庫?

(1)方便共享代碼,便于合理使用。
(2)實現(xiàn)iOS程序的模塊化。可以把固定的業(yè)務(wù)模塊化成靜態(tài)庫。
(3)和別人分享你的代碼庫,但不想讓別人看到你代碼的實現(xiàn)。
(4)開發(fā)第三方sdk的需要。

八、制作靜態(tài)庫時的幾點注意:

(1) 注意理解:無論是.a靜態(tài)庫還.framework靜態(tài)庫,我們需要的都是二進制文件+.h+其它資源文件的形式,不同的是,.a本身就是二進制文件,需要我們自己配上.h和其它文件才能使用,而.framework本身已經(jīng)包含了.h和其它文件,可以直接使用。
(2)圖片資源的處理:兩種靜態(tài)庫,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一個文件夾,把它改名為.bundle就可以了,右鍵,顯示包內(nèi)容可以向其中添加圖片資源。
(3) category是我們實際開發(fā)項目中經(jīng)常用到的,把category打成靜態(tài)庫是沒有問題的,但是在用這個靜態(tài)庫的工程中,調(diào)用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態(tài)庫的工程中配置other linker flags的值為-ObjC。
(4)如果一個靜態(tài)庫很復(fù)雜,需要暴露的.h比較多的話,就可以在靜態(tài)庫的內(nèi)部創(chuàng)建一個.h文件(一般這個.h文件的名字和靜態(tài)庫的名字相同),然后把所有需要暴露出來的.h文件都集中放在這個.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了。


B ->現(xiàn)在來介紹兩種靜態(tài)庫的打包創(chuàng)建方式


.a靜態(tài)庫的創(chuàng)建

(1)Xcode創(chuàng)建靜態(tài)庫工程

創(chuàng)建工程.png

(2)將需要打包成靜態(tài)庫的文件拖到工程的中【我在事例中直接創(chuàng)建一個簡單的類和方法演示說明】
類文件.png

此時會發(fā)現(xiàn) Products 下的文件是紅色的靜態(tài)庫,這表明還不存在這個文件
靜態(tài)庫位置.png

(3)此時可以查看設(shè)置你想要在靜態(tài)庫中暴露出來的接口頭文件
targets->Build Phases->Copy Files->”+”你需要公開的頭文件

查看頭文件.png

(4)iPhone 5模擬器正好是i386架構(gòu),iPhone 7模擬器 的cpu是 x86_64架構(gòu)。所以還需要進行一步設(shè)置,使模擬器靜態(tài)庫支持i386 、x86_64設(shè)置如何查看靜態(tài)庫所支持的架構(gòu),請看下一步:
配置設(shè)置.png

(5)此時進行模擬器和真機兩個版本靜態(tài)庫Build編譯,當(dāng)Product中的靜態(tài)庫文件變成黑色字體表明靜態(tài)庫已經(jīng)編譯成功
![真機編譯.png](http://upload-images.jianshu.io/upload_images/1616138-6d4e67ecad13ff52.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

編譯成功.png

(6)show in finder 查看會發(fā)現(xiàn)模擬器和真機兩個版本的靜態(tài)庫,并且使用終端查看兩個靜態(tài)庫分別支持的cpu框架
$ lipo -info 靜態(tài)庫文件位置(直接拖入)

支持cpu架構(gòu).png

(7)最后所需要做的就是講兩個靜態(tài)庫合并成為一個靜態(tài)庫
打開終端,輸入
lipo -create 靜態(tài)庫1路徑 靜態(tài)庫2路徑 -output 合并的靜態(tài)庫
合成.png

最終的靜態(tài)庫.png

(8)將編譯合并的靜態(tài)庫添加上 .h 文件就可以正常導(dǎo)入使用啦
靜態(tài)庫.png


.Framework靜態(tài)庫的創(chuàng)建

(1)同樣創(chuàng)建 .Framework工程,然后導(dǎo)入需要打包的文件

靜態(tài)庫工程.png

格式注意.png

(2)在工程的 Build phases中設(shè)置靜態(tài)庫需要暴露的就扣頭文件
設(shè)置頭文件.png

如圖所示,需要將暴露的頭文件放到 Public目錄下,否則調(diào)用者將無法查看調(diào)用頭文件
(3)此時在模擬器上Build進行編譯,會發(fā)現(xiàn)Product下的靜態(tài)庫文件變成黑色字體,表示模擬器版本已經(jīng)編譯成功
build.png

(4)需要進行編譯真機版的 Framework選中target->在工具欄點擊Editor->Add Target->在彈出的選擇框中選擇Corss-platform->Aggregate->Next;現(xiàn)在你的工程總有了兩個target
添加真機target.png

步驟.png

然后需要在進行下圖所示添加 Run Script
添加Phase.png

(5)進行配置腳本,合并 Framework 并生成最終的靜態(tài)庫;腳本如下:

# Sets the target folders and the final framework product.
# 如果工程名稱和Framework的Target名稱不一樣的話,要自定義FMKNAME
# 例如: FMK_NAME = "MyFramework"
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.
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}/"
cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"

如下圖所示

腳本輸入.png

(6)選擇新建的真機Target在真機狀態(tài)下進行Build編譯,當(dāng)成功之后會自動彈出文件,這是最終的 Framework 靜態(tài)庫就行創(chuàng)建打包好了,當(dāng)你的靜態(tài)庫中需要使用圖片時,也可以為Framework添加 .Bundle 的資源包,最后拖入工程就可以使用了
真機編譯.png

最終靜態(tài)庫.png


以上就是對創(chuàng)建 .a 和 .Framework 兩種靜態(tài)庫的簡單介紹,使用以后再項目中可以創(chuàng)建自己的靜態(tài)庫或者設(shè)計SDK供其他人使用啦

參考:http://blog.csdn.net/stackhero/article/details/9032999 http://blog.csdn.net/qi_ruihua/article/details/38514623?utm_source=tuicool&utm_medium=referral

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容