PHP提示dyld: Library not loaded問題解決
Mac在命令列執行php命令時,如php -v 有錯誤提示:
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0..dylib
Referenced from: /usr/local/bin/php
Reason: image not found
表面看是缺少了libcrypto.1.0.0檔案,mac自帶的openssl是0.9.8,可以命令列檢視下:
/usr/bin/openssl version OpenSSL 0.9.8zh Jan
之前已經使用brew安裝了最新的openssl,版本1.1.1g。brew預設安裝目錄是沒有openssl的目錄,都是使用
brew switch openssl 1.1
建立openssl目錄,使用的是切換後的版本1.1,由於是1.1版本,沒有1.0,使用軟鏈 ln -s 建立檔案連結到1.1。
照理說這樣是可行的,但依然會提示錯誤:
dyld: Symbol not found: _SSL_library_init
查閱資料,openssl1.1跟1.0變化比較大。這種變化導致部分使用的1.0版本的軟體無法相容1.1,最新版本的php可能有解決此問題,這個我就沒有去試驗,我使用的是7.1.33版本。
以上載圖來自:https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes
這樣就不能使用1.1版本了,brew當前已經去除了openssl1.0的支援,只有1.1版本,mac版本又太低,這個時候只能選擇自己編譯安裝。
下載地址:https://www.openssl.org/source/old/1.0.2/
選擇一個版本下載到本地,開始安裝:
./Configure darwin64-x86_64-cc shared --prefix=/usr/local/
記得要加上shared,幾乎網上資料都沒有說明這點,導致安裝多次都沒有成功。只有加shared引數才會生成dylib檔案。
make
sudo make install
在/usr/local/目錄下安裝需要管理員許可權,所以要加上sudo,也可以選擇另外的目錄,將include, lib和bin等目錄安裝在同一個目錄,後面再另外指定就可以。
安裝完成後,預設的openssl已經是最新安裝的版本了。
which openssl
/usr/local/bin/openssl
到這一步還沒完成,PHP的openssl依賴也需要一併調整。
使用命令檢視PHP當前依賴:
otool -L /usr/local/bin/php
修改libcrypto和libssl的路徑:
install_name_tool -change /usr/local/opt/openssl/lib/libcrypto.1.1.dylib /usr/local/lib/libcrypto.1.0..dylib /usr/local/bin/php install_name_tool -change /usr/local/opt/openssl/lib/libssl.1.1.dylib /usr/local/lib/libssl.1.0..dylib /usr/local/bin/php
這樣,問題解決。