为什么CentOS7上不能执行?
CentOS7都是10几年前的系统了,其使用的gcc、glibc等工具太老了,提供的so文件所需的最低依赖版本 远远大于 centos7的最高版本,因此有三种方式
- 方式一:在低版本gcc、glibc上重新编译.so
- 能力有限,我自己低版本编译后的so有问题,后续再研究一下
- 方式二:升级CentOS7上的gcc、glibc版本,升级也有两种方式
- 方式一:使用SCL修改版本(自行查找资料)
- 方式二:编译(本文提供此种方式的指引)
- 方式三:在你的系统上重新编译.so
- 编译请参考如何自行编译动态库
使用ldd -r /目录/xxx.so
,可以查看动态库链接。
如下图,使用命令查看high.so的动态库链接,从红色箭头往下看⬇️,发现都成功链接了。
- 此处的high.so你可以替换为 /目录/libRapidOcr.so。因为我有多个版本的该库文件,high是表示高版本的,本质上就是libRapidOcr.so,改名了而已
- 一般来说,你的库文件可能会位于:tmp/ocrJava/onnx/libRapid0cr.so
下图是链接失败,提示GLIBCXX_3.4.26 not found
,此时说明你的环境版本太低了,需要升级。
一般来说,要想链接成功,需要确保:
- 确保gcc>=9.1.0
- 确保cmake>=4
- 确保GLIBC>=2.26
下文是具体的升级步骤
⚠️ 注意:
- 升级Gcc有风险,正式环境升级请做好快照等充足的准备!!!
- 请充分了解升级的风险后再进行升级!!!
创建并进入到一个临时目录
mkdir temp
cd /temp
下载源码包
wget http://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc-9.1.0.tar.gz
解压、进入文件
tar -zxvf gcc-9.1.0.tar.gz
cd gcc-9.1.0
利用源码包里自带的工具下载所需要的依赖项,它会下载几个依赖:mpfr、mpc、gmp,这一步的速度看你的网络情况
./contrib/download_prerequisites
如果报错了,查看gcc-9.1.0里面的mpfr、mpc、gmp相关的文件,删除了重新执行上面的命令即可
创建编译输出目录:
mkdir build
进入build目录,并生成Makefile
cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
编译,这一步非常耗时,一般是1-3小时左右
make
编译完成之后,安装
make install
查找最新的动态库
find / -name "libstdc++.so*"
执行结果如下,重点关注6.0.26(我们需要使用的)
/usr/local/lib64/libstdc++.so.6.0.26
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.25-gdb.py
/usr/local/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/lib64/libstdc++.so.6
/data/result/SegParser/libstdc++.so.6
/data/download_record/SegParser/libstdc++.so.6
/data/segdsegy/SegParser/libstdc++.so.6
这代表高版本的动态库,因此需要将此库复制到/usr/lib64/路径下并重新建立软连接
cd /usr/lib64
cp /usr/local/lib64/libstdc++.so.6.0.26 /usr/lib64/
rm libstdc++.so.6
ln -s libstdc++.so.6.0.26 libstdc++.so.6
默认为3,升级为4
wget http://ftp.gnu.org/gnu/make/make-4.3.tar.gz
tar -xzvf make-4.3.tar.gz && cd make-4.3/
./configure --prefix=/usr/local/make
make && make install
cd /usr/bin/ && mv make make.bak
ln -sv /usr/local/make/bin/make /usr/bin/make
wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
tar xf glibc-2.28.tar.gz
cd glibc-2.28/ && mkdir build && cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-werror
make
make install
# 使用下面的命令查看是否存在GLIBC_2.27(注意,看是不是存在2.27!!!)
strings /lib64/libc.so.6 |grep GLIBC_
参考文档