PHP提示dyld: Library not loaded问题解决
Mac在命令行执行php命令时,如php -v 有错误提示:
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.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 14 Jan 2016
之前已经使用brew安装了最新的openssl,版本1.1.1g。brew默认安装目录是没有openssl的目录,都是使用openssl@1.1这样的目录,使用命令
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.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.0.dylib /usr/local/bin/php
这样,问题解决。