iOS靜態(tài)庫和動態(tài)庫的使用

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)庫 好處:
  • 模塊化,分工合作,提高了代碼的復(fù)用及核心技術(shù)的保密程度
  • 避免少量改動經(jīng)常導(dǎo)致大量的重復(fù)編譯連接
  • 也可以重用,注意不是共享使用
動態(tài)庫 好處:
  • 使用動態(tài)庫,可以將最終可執(zhí)行文件體積縮小,將整個應(yīng)用程序分模塊,團隊合作,進行分工,影響比較小
  • 使用動態(tài)庫,多個應(yīng)用程序共享內(nèi)存中得同一份庫文件,節(jié)省資源
  • 使用動態(tài)庫,可以不重新編譯連接可執(zhí)行程序的前提下,更新動態(tài)庫文件達(dá)到更新應(yīng)用程序的目的。
  • 應(yīng)用插件化
  • 軟件版本實時模塊升級

1.生成靜態(tài)庫

1.1 新建靜態(tài)庫工程

屏幕快照 2019-04-24 下午4.37.26.png

1.2 編寫功能

屏幕快照 2019-04-24 下午4.37.32.png

1.3 然后command+b 編譯,生成.a 文件

屏幕快照 2019-04-24 下午4.40.57.png

1.4 然后利用 lipo -info 查看靜態(tài)庫所支持的cpu架構(gòu)

屏幕快照 2019-04-24 下午4.41.52.png

如果需要真機的 可以變一下真機的靜態(tài)庫

lipo -create ../x.a ../x.a -output test.a

1.5 把合成的靜態(tài)庫導(dǎo)入到項目中

分別把.a文件和.h文件 導(dǎo)入功能,在所需要引用的地方,導(dǎo)入頭文件,即可使用

2.生成動態(tài)庫

2.1 生成動態(tài)庫項目

屏幕快照 2019-04-24 下午5.10.38.png

2.2 把想要暴露的頭文件 拖動到public 文件夾中

屏幕快照 2019-04-24 下午5.11.32.png

2.3 把framework 導(dǎo)入到工程中

由于動態(tài)庫不會被鏈接到目標(biāo)代碼中,所以必須手動cpoy到項目中


屏幕快照 2019-04-24 下午5.15.50.png

2.4 然后運行

2.5 合并真機和模擬器的庫

在Xcode中添加執(zhí)行腳本


2068442-6174f5acae9a9c41.jpeg

Project --> TARGETS --> Build Phases -> + --> New Run Script Phases 添加執(zhí)行腳本,如下:

# Type a script or drag a script file from your workspace to insert its path.
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework

DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework

SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework

# 如果真機包或模擬包不存在,則退出合并
if [ ! -d "${DEVICE_DIR}" ] || [ ! -d "${SIMULATOR_DIR}" ]
then
exit 0
fi

# 如果合并包已經(jīng)存在,則替換
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"

# 使用lipo命令將其合并成一個通用framework  
# 最后將生成的通用framework放置在工程根目錄下新建的Products目錄下  
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"

#合并完成后打開目錄
open "${SRCROOT}/Products"

fi

注意: 只有在真機,模擬器各編譯一次后,才會在工程/Products目錄下生產(chǎn)合并包,如不希望自動打開目錄,注釋掉最后一句#open "${SRCROOT}/Products"即可

GitHub靜態(tài)庫和動態(tài)庫demo

?著作權(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)容