iOS上動態(tài)庫依賴避免符號和版本沖突問題

今天交付了一個功能庫,但是同事反饋運行時有崩潰

dyld[33893]: Library not loaded: @rpath/eslog.framework/eslog
Referenced from: <EF42CD7A-4A3B-3413-9661-928323F63135> /private/var/containers/Bundle/Application/CE99316C-B01C-472D-8C1E-B62B490C5284/iOSDemo.app/Frameworks/MHUltrasound.framework/MHUltrasound
Reason: tried: '/private/var/containers/Bundle/Application/CE99316C-B01C-472D-8C1E-B62B490C5284/iOSDemo.app/Frameworks/eslog.framework/eslog' (no such file), '/private/var/containers/Bundle/Application/CE99316C-B01C-472D-8C1E-B62B490C5284/iOSDemo.app/Frameworks/MHUltrasound.framework/Frameworks/eslog.framework/eslog' (code signature invalid in <D800E115-8EEC-34BE-8DCA-4849B3C88C41> '/private/var/containers/Bundle/Application/CE99316C-B01C-472D-8C1E-B62B490C5284/iOSDemo.app/Frameworks/MHUltrasound.framework/Frameworks/eslog.framework/eslog' (errno=1) sliceOffset=0x00000000, codeBlobOffset=0x0008B1D0, codeBlobSize=0x00006540), '/private/var/containers/Bundle/Application/CE99316C-B01C-472D-8C1E-B62B490C5284/iOSDemo.app/Frameworks/eslog.framework/eslog' (no such file), '/private/var/containers/Bundle/Application/CE99316C-B01C-472D-8C1E-B62B490C5284/iOSDemo.app/Frameworks/eslog.framework/eslog' (no such file), '/private/var/containers/Bundle/Application/CE99316C-B01C-472D-8C1E-B62B490C5284/iOSDemo.app/Frameworks/eslog.framework/eslog' (no such file), '/private/var/containers/Bundle/Application/CE99316C-B01C-472D-8C1E-B62B490C5284/iOSDemo.app/Frameworks/eslog.framework/eslog' (no such file), '/System/Library/Frameworks/eslog.framework/eslog' (no such file, not in dyld cache)

注意看報錯(code signature invalid in <D800E115-8EEC-34BE-8DCA-4849B3C88C41>
我這里給出去的是A庫,但是A庫下面動態(tài)鏈接了B庫,一開始我考慮為了方便,把B庫Embed & sign in到A庫中,然后就出現(xiàn)了上面的簽名問題。
并且從上面的報錯可以看到,除非強指定rpath搜索路徑,不然它會默認(rèn)從app的Frameworks目錄下開始搜索。
這里其實暴露了兩個問題

  1. 如何解決該簽名問題
    解決方式是把B庫暴露在和A庫同一級目錄下,為了達(dá)到這個目的,我們可以在podspec中加上如下代碼
spec.vendored_frameworks =  'B.framework'

這樣cocoapods在安裝時會把他們作為同一級目錄安裝,到時候在app的產(chǎn)物目錄下也會出現(xiàn)在Frameworks同一級目錄。

  1. 引申問題,假設(shè)B庫作為一個基礎(chǔ)庫,后續(xù)被開發(fā)同事在引用其他庫時也用到了,比如現(xiàn)在導(dǎo)入C庫,C庫也引用到了B庫,A和C同時依賴了B,如果不把B庫推到線上統(tǒng)一管理,那么A和C依賴的B庫版本不一致,很可能后面會出現(xiàn)一些奇奇怪怪的符號崩潰問題或者ABI不穩(wěn)定出現(xiàn)鏈接問題。
?著作權(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)容