1. 程式人生 > 實用技巧 >fastlane : dyld: libssl.1.0.0.dylib not loaded.

fastlane : dyld: libssl.1.0.0.dylib not loaded.

做jenkins 的 ios 構建,借用 fastlane 來做打包和上傳,遇到了一些問題。執行 fastlane init 時,其中的 bundle update 命令報錯。dlopen 呼叫動態庫失敗。以下是報錯資訊:

/usr/local/opt/openssl/lib/libssl.1.0.0.dylib (LoadError)大致的意思是這個路徑下沒有這個檔案。

看了以下/usr/local/Cellar/ruby/2.6.4/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb 的 54 行,

按照路徑去require一個什麼東西,ruby沒學過,但大致的意思是需要這個路徑的東西,找不到就報錯了。

於是去看了一下/usr/local/opt/openssl/lib/,也就是它認為應當有但是沒有的路徑[usr/local/opt一般是本地安裝的動態連結庫]。

果然沒有libssl.1.0.0.dylib ,但是有libssl.1.1.1.dylib。ssl肯定是加解密相關的應當不會有改壞環境的風險,所以,複製一下,改個名,libssl.1.1.dylib -> libssl.1.0.0.dylib,再執行bundle update ,發現缺 libcrypto.1.0.0.dylib。於是在複製一個libcrypto.1.1.dylib -> libcrypto.1.0.0.dylib。再執行bundle update,報錯如下:

他們的確是載入到執行時中了,由於1.1的API變更了,導致不能降級。所以,這條路走不通。

換個思路,通過kernel_require.rb的程式碼追溯找到openssl.rb,發現沒有明確指定openssl的路徑,這說明這裡取的是系統提供的。

系統提供的openssl是通過homebrew安裝的,結合網上看到的一些解決方案,是通過homebrew給openssl降級,決定嘗試使用homebrew的降級命令。

檢視一下 當前使用的openssl,在這個目錄開啟資料夾

發現這個資料夾實際開啟的路徑不是命令列的路徑,說明這個路徑實際上是一個軟連線。

沿著路徑向上發現一個 openssl 和

[email protected] 平級,在檢視一下這個平級的 openssl 資料夾

這裡面是有一個1.0.2s的,說明本地已經存在一個1.0.x的版本,嘗試從brew降級到這個版本,也就是重置軟連線到這個版本的目錄上。這樣預設提供的openssl的動態庫就實現了降級。網上找了一下brew切換版本的命令,執行結果如下。

再次執行bundle update,就通過了。

---------------------------------------------------------------------------------------------------------------------------------------華麗分割線

1.報錯資訊要仔細看

2.通過函式名,猜這個函式大致在幹什麼。比如 dlopen()

3.有必要簡單讀一下程式碼,就算這個語言沒有學過,通過函式和邏輯進行一些猜測。

4.在網上搜相關內容,篩選掉無用資訊,整合已知和報錯表象,進行嘗試。

5.注意安全,比如 直接改名libssl.1.1.dylib -> libssl.1.0.0.dylib 這樣的做法,如果這個lib有資料夾操作,就很危險。大致推測一下修改的後果,再進行這樣的嘗試[Mac 的TimeMachine 給了我這樣的勇氣]。