關(guān)于Xcode12靜態(tài)庫打包的一些心得

最近在玩靜態(tài)庫打包,時不時遇到如下這種報錯,可能是Xcode升級的緣故,之前是沒有遇到過,故此總結(jié)了一波...

Building for iOS Simulator, but the linked library 'libxxx.a' was built for iOS.

這個問題是因為模擬器編譯的那個.a沒有合并,只是打了真機的.a,運行到模擬器而模擬器是x86_64的架構(gòu),如果不需要模擬器調(diào)試,直接真機的即可

另: 模擬器打包與真機的包無法合并,出現(xiàn)arm64重復,無法合并為fat的問題
Build settings->Excluded Architectures里忽略當前SDK不支持的架構(gòu)
模擬器SDK下可以忽略真機的架構(gòu)arm64,arm64e,其實不適配5s以下的話直接把i386也去掉也是可以的,同樣真機也可去掉armv7和armv7s,這樣做的好處是可以減小包體積

現(xiàn)在新iPhone X以上iPhone 11 iPhone12等支持新架構(gòu)得加一個arm64e,在Architectures里的other里手動添加即可

所以目前解決辦法就是打多個版本的靜態(tài)庫
比如:

  • 全量包 i386,x86_64,armv7,armv7s,arm64,arm64e
  • 拆分包
    • 真機和模擬器的拆分
      • 模擬器 i386,x86_64
      • 真機 armv7,armv7s,arm64,arm64e
    • 每一種架構(gòu)單獨拎出來,lipo命令自己按需合并

一般來說,開發(fā)調(diào)試的話就用全量包,發(fā)布上線用真機包

講道理,一些舊設備都被系統(tǒng)所淘汰了,iOS10起步支持iPhone 5s以上,那就大可不必支持i386和armv7,直接arm64和x86_64即可,上線打包可以剔除x86_64,這樣才是最優(yōu)解

編譯.a的腳本如下(采用手動編譯+腳本合成):

ps: 自動編譯在Xcode12.3不知道出了什么鬼,xcodebuild一直死循環(huán)就是編譯不過,無奈之下采取半自動了,不過配合say語音提示也是可以的

prismjs language

#! /bin/sh
# 先在工程根目錄創(chuàng)建好SDK文件夾
mkdir -p ${PROJECT_NAME}_SDK
cd ${PROJECT_NAME}_SDK
mkdir -p ${PROJECT_NAME}
cd ${PROJECT_NAME}
mkdir -p include
mkdir -p lib

#回到工程目錄
cd ./../../
#真機build生成的.a文件路徑
DEVICE_DIR_A=${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a
#模擬器build生成的.a文件路徑
SIMULATOR_DIR_A=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a

if [[ -f "${DEVICE_DIR_A}" ]]; then
    say "真機編譯完成"
fi

if [[ -f "${SIMULATOR_DIR_A}" ]]; then
    say "模擬器編譯完成"
fi

if [[ -f "${DEVICE_DIR_A}" ]] ; then
    if [[ -f "${SIMULATOR_DIR_A}" ]]; then
        lipo -create ${DEVICE_DIR_A} ${SIMULATOR_DIR_A} -output ./${PROJECT_NAME}_SDK/${PROJECT_NAME}/lib/lib${PROJECT_NAME}.a
        #頭文件轉(zhuǎn)移大法
        HEADER_FOLDER="${BUILD_DIR}/${CONFIGURATION}-iphoneos/include/${PROJECT_NAME}"
        cp -a ${HEADER_FOLDER}/. ./${PROJECT_NAME}_SDK/${PROJECT_NAME}/include
        open ./
        say "靜態(tài)庫合并成功"
    fi
fi

編譯framework與.a類似

prismjs language

#! /bin/sh
#創(chuàng)建存放目錄
mkdir -p ${PROJECT_NAME}.framework
INSTALL_DIR=./${PROJECT_NAME}.framework

#真機編譯產(chǎn)物
DEVICE_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
#模擬器編譯產(chǎn)物
SIMULATOR_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework

#.framework是目錄是文件夾 所以用-d判斷 文件用-f
if [[ -d "$DEVICE_DIR" ]]; then
    say "真機編譯完成"
fi

if [[ -d "$SIMULATOR_DIR" ]]; then
    say "模擬器編譯完成"
fi

if [[ -d "${DEVICE_DIR}" ]] ; then
    if [[ -d "${SIMULATOR_DIR}" ]]; then
        cp -R ${DEVICE_DIR}/ ${INSTALL_DIR}/
        lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
        open ./
        say "靜態(tài)庫合并成功"
    fi
fi

更新于2020-01-11

有時候模擬器編譯失敗而報錯
The linked library 'xxxx.a/Framework' is missing one or more architectures required by this target: armv7/或者是x86_64
真機SDK編譯模擬器或者是模擬器SDK編譯真機,lipo -info xxx查看架構(gòu)排除原因
① 如果是沒有合并,則需要合并
② 如果已合并,則需要差異化排除

在TARGETS ——> Build Settings-Excluded Architectures 添加如下代碼:

prismjs language

EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64=arm64 arm64e armv7 armv7s armv6 armv8 EXCLUDED_ARCHS=$(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))

選擇模擬器SDK編譯的時候,排除真機架構(gòu),同理,編譯真機SDK時,排除模擬器的架構(gòu),Excluded是排除的意思. 拷貝上面這句代碼往上一粘就完事了

-all_load , -force_load , -ObjC 的區(qū)別和妙用

  1. -all_load 鏈接器把目標文件都加載進來,不能草率使用這個,項目很大或者依賴的庫很多可能會出現(xiàn)沖突,提示重復依賴之類的錯誤,在知道各個庫使用情況之下,最好是使用-force_load一個個指定庫文件去加載.
  2. -force_load-all_load用法類似,指定目標文件加載
  3. -ObjC用于加載分類category,類和分類同時存在于靜態(tài)庫時使用-ObjC沒毛病,但是如果沒有包含類對象,僅僅只是category是加載不進去的,如果什么都不加,靜態(tài)庫中的category在外部調(diào)用的時候會直接報錯: unrecognized selector xxx , 一般情況都是配合 -all_load-force_load一起使用.

一些相關(guān)文章

解決-Xcode-11-4-以來模擬器編譯報錯-Building-for-iOS-Simulator-but-the-linked-library-was-built-for-iOS-的正確姿勢
Xcode 12 - Architecture相關(guān)問題
iOS CPU架構(gòu)(ARM指令集)
iOS 打包移除 i386 和 x86_64 平臺動態(tài)庫
Python小工具: 去除iOS靜態(tài)庫(.a或.framework)模擬器架構(gòu)代碼
Xcode升級12編譯報錯The linked library is missing one or more architectures required by this target

未經(jīng)作者授權(quán),禁止轉(zhuǎn)載

本文來自博客園远舅,作者:CoderWGB激才,轉(zhuǎn)載請注明原文鏈接:https://www.cnblogs.com/wgb1234/p/14258036.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沉迹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖哼丈,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件边器,死亡現(xiàn)場離奇詭異训枢,居然都是意外死亡,警方通過查閱死者的電腦和手機忘巧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門恒界,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砚嘴,你說我怎么就攤上這事十酣。” “怎么了际长?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵耸采,是天一觀的道長。 經(jīng)常有香客問我工育,道長颅和,這世上最難降的妖魔是什么抄瑟? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任峦甩,我火速辦了婚禮,結(jié)果婚禮上旭贬,老公的妹妹穿的比我還像新娘。我一直安慰自己搪泳,他們只是感情好稀轨,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著森书,像睡著了一般靶端。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凛膏,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天杨名,我揣著相機與錄音,去河邊找鬼猖毫。 笑死台谍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的吁断。 我是一名探鬼主播趁蕊,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仔役!你這毒婦竟也來了掷伙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤又兵,失蹤者是張志新(化名)和其女友劉穎任柜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沛厨,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡宙地,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逆皮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宅粥。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖电谣,靈堂內(nèi)的尸體忽然破棺而出秽梅,到底是詐尸還是另有隱情,我是刑警寧澤辰企,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布风纠,位于F島的核電站,受9級特大地震影響牢贸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镐捧,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一潜索、第九天 我趴在偏房一處隱蔽的房頂上張望臭增。 院中可真熱鬧,春花似錦竹习、人聲如沸誊抛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拗窃。三九已至,卻和暖如春泌辫,著一層夾襖步出監(jiān)牢的瞬間随夸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工震放, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宾毒,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓殿遂,卻偏偏與公主長得像诈铛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墨礁,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容