最近在一台centos7(amd64)服务器上调用一个底层库时,分别遇到了以下几个错误,在此记录下解决方法
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found
/lib64/libcrypto.so.1.0.0: version `OPENSSL_1.0.0’ not found
libssl.so.1.0.0: cannot open shared object file: No such file or directory
/lib64/libssl.so.1.0.0: symbol SHA256_Transform, version OPENSSL_1.0.2 not defined in file libcrypto.so.1.0.0 with link time reference
方法有很多,可以源码编译安装、或者编译后提取需要的so文件
我这里方法是从deb包中解压出需要的so文件,替换到系统目录
首先用strings命令查看版本确实不存在
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3
strings /usr/lib64/libcrypto.so.1.0.0 | grep OPENSSL_1
先解决第一个libstdc++.so.6,步骤如下:
这个是包含在gcc里的,首先可以考虑更新gcc版本来解决
下面步骤是仅提取so文件的方法(可能会缺少别的依赖so文件)
# 新建个目录进入
mkdir /tmp/libstdc
cd /tmp/libstdc
# 下载一个高版本gcc中的deb包,这里选了gcc8
wget http://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/g/gcc-8/libstdc++6_8.4.0-1ubuntu1~18.04_amd64.deb
# 解压deb
ar x libstdc++6_8.4.0-1ubuntu1~18.04_amd64.deb
# 解压其中的data.tar.xz
tar xvf data.tar.xz
# 确认解压出的libstdc++.so.6.0.25包含需要版本
strings ./usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25 |grep GLIBCXX_3.4.21
# 复制到系统目录
cp ./usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25 /usr/lib64/
# 更新libstdc++.so.6软链
ln -snf /usr/lib64/libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6
同理,解决libcrypto.so、libssl.so步骤如下:
# 新建个目录进入
mkdir /tmp/libssl
cd /tmp/libssl
# 下载libssl1.0.0_1.0.2n的deb包
wget http://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/o/openssl1.0/libssl1.0.0_1.0.2n-1ubuntu5.11_amd64.deb
# 解压
ar x libssl1.0.0_1.0.2n-1ubuntu5.11_amd64.deb
# 解压其中的data.tar.xz
tar xvf data.tar.xz
# 复制需要的so文件到系统目录
cp usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /usr/lib64/
cp usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 /usr/lib64/
如果是debian或ubuntu,可以直接安装deb包
sudo dpkg -i libssl1.0.0_1.0.2n-1ubuntu5.11_amd64.deb