今天交付了一個功能庫,但是同事反饋運行時有崩潰
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目錄下開始搜索。
這里其實暴露了兩個問題
- 如何解決該簽名問題
解決方式是把B庫暴露在和A庫同一級目錄下,為了達(dá)到這個目的,我們可以在podspec中加上如下代碼
spec.vendored_frameworks = 'B.framework'
這樣cocoapods在安裝時會把他們作為同一級目錄安裝,到時候在app的產(chǎn)物目錄下也會出現(xiàn)在Frameworks同一級目錄。
- 引申問題,假設(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)鏈接問題。