iOS 基于XCode12 腳本封裝靜態(tài)鏈接庫(kù)文件 .a
1. 創(chuàng)建工程 勾線 iOS -> Static Library 命名 first
2. 工程里自動(dòng)生成的first.h first.m 文件 手動(dòng)刪除 添加新的自己的打包文件:
這里添加HFTest.h,HFTest.m
3. Target Build Setting 里搜索 Excluded Architectures,
設(shè)置Release 為 Any iOS Simulator SDK:arm64 目的:為模擬器去掉架構(gòu)arm64
原因:Xcode12之前:編譯模擬器靜態(tài)庫(kù)支持i386 x86_64兩架構(gòu);編譯真機(jī)靜態(tài)庫(kù)支持armv7 arm64兩架構(gòu)。現(xiàn)在Xcode12編譯的模擬器靜態(tài)庫(kù)也支持了arm64,導(dǎo)致出現(xiàn)真機(jī)庫(kù)和模擬器庫(kù)不能合并的問題。
會(huì)報(bào)錯(cuò)“fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /Users/song/Documents/LiSourse/2021Demo/Second/Build/Release-iphoneos/libSecond.a and /Users/song/Documents/LiSourse/2021Demo/Second/Build/Release-iphonesimulator/libSecond.a have the same architectures (arm64) and can't be in the same fat output file” ??
4. 露出指定的頭文件,這里是HFTest.h
Target->Build Phases -> Copy Files-> 添加HFTest.h 文件
5. 創(chuàng)建腳本, 運(yùn)行腳本即可
腳本功能 代替了 手動(dòng)切換 release 環(huán)境 手動(dòng) 編譯 并合并 release 環(huán)境下 真機(jī)靜態(tài)鏈接庫(kù)文件libfirst.a和模擬器libfirst.a 的過程
實(shí)現(xiàn)了 在release 環(huán)境下 自動(dòng)編譯build 并合并出libfirst.a
添加腳本Script.sh ??腳本目錄和xxxx.xcodeproj要在同一個(gè)目錄
在腳本同級(jí)目錄運(yùn)行腳本即可 :
sh Script.sh
#!/bin/sh # Script.sh # Second # # Created by HF on 2021/7/9. # #注意:腳本目錄和xxxx.xcodeproj要在同一個(gè)目錄,如果放到其他目錄,請(qǐng)自行修改腳本。 #要build的target名 #要build的target名 target_Name=Second echo "target_Name=${target_Name}" #工程名 project_name=$target_Name echo "project_name=${project_name}" #打包模式 Debug/Release 默認(rèn)是Release development_mode=Release #當(dāng)前腳本文件所在的路徑 $(pwd) SCRIPT_DIR=$(pwd) echo "======腳本路徑=${SCRIPT_DIR}======" #工程路徑 #PROJECT_DIR=${SCRIPT_DIR} 和下面寫法也樣 PROJECT_DIR=$SCRIPT_DIR echo "======工程路徑=${PROJECT_DIR}======" #build之后的文件夾路徑 build_DIR=$SCRIPT_DIR/Build echo "======Build路徑=${build_DIR}======" #真機(jī)build生成的頭文件的文件夾路徑 DEVICE_DIR_INCLUDE=${build_DIR}/${development_mode}-iphoneos/include/${project_name} #真機(jī)build生成的.a文件路徑 DEVICE_DIR_A=${build_DIR}/${development_mode}-iphoneos/lib${project_name}.a echo "======真機(jī).a路徑=${DEVICE_DIR_A}======" #模擬器build生成的.a文件路徑 SIMULATOR_DIR_A=${build_DIR}/${development_mode}-iphonesimulator/lib${project_name}.a echo "======模擬器.a路徑=${SIMULATOR_DIR_A}======" #目標(biāo)文件夾路徑(也就SDK的文件:.a文件 和 頭文件) INSTALL_DIR=${build_DIR}/Products/${project_name} echo "======SDK的文件夾路徑=${INSTALL_DIR}======" #目標(biāo)頭文件的文件夾路徑 INSTALL_DIR_Headers=${build_DIR}/Products/${project_name}/Headers echo "======頭文件的文件夾路徑=${INSTALL_DIR}======" #目標(biāo).a路徑 INSTALL_DIR_A=${build_DIR}/Products/${project_name}/lib${project_name}.a echo "======目標(biāo).a路徑=${INSTALL_DIR}======" #判斷build文件夾是否存在,存在則刪除 #rm -rf 命令的功能:刪除一個(gè)目錄中的一個(gè)或多個(gè)文件或目錄 if [ -d "${build_DIR}" ] then rm -rf "${build_DIR}" fi #判斷目標(biāo)文件夾是否存在,存在則刪除該文件夾 if [ -d "${INSTALL_DIR}" ] then rm -rf "${INSTALL_DIR}" fi #創(chuàng)建目標(biāo)文件夾 mkdir -p "${INSTALL_DIR}" echo "======盒子已經(jīng)準(zhǔn)備好了,開始生產(chǎn).a 并合成裝到盒子里吧======" #build之前clean一下 xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphonesimulator clean xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphoneos clean #模擬器build xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphonesimulator #真機(jī)build xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphoneos #復(fù)制頭文件到目標(biāo)文件夾 #使用-R參數(shù)可實(shí)現(xiàn)遞歸功能,即所有子目錄中的文件與目錄均拷貝 cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}" #合成模擬器和真機(jī).a包 lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}" echo "======合成結(jié)束======" # -f 判斷文件是否存在 if [ -f "${INSTALL_DIR_A}" ] then echo "======驗(yàn)證合成包是否成功======" lipo -info "${INSTALL_DIR_A}" fi #打開目標(biāo)文件夾 open "${INSTALL_DIR}"
6.把目標(biāo)文件夾里面的靜態(tài)庫(kù)和頭文件 資源文件可以放在項(xiàng)目里 import 頭文件然后調(diào)用
參考:
1.http://www.rzrgm.cn/wgb1234/p/14258036.html
2.http://www.rzrgm.cn/richard-youth/p/14447991.html?ivk_sa=1024320u
3.https://blog.csdn.net/shifang07/article/details/89177545
posted on 2021-07-09 16:05 ACM_Someone like you 閱讀(334) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)