如果在Centos7或者更低版本的操作系统上运行jar可能会报错glibc版本问题,请按照下列更新版本。如果使用Docker镜像部署,请不要使用 openjdk17 这种基础镜像,因为他基于Debian11操作系统同样也会产生上述问题。可以使用 eclipse-temurin:17-jdk-jammy 这种基础镜像。
问题背景
为什么CentOS7上不能执行?
CentOS7都是10几年前的系统了,其使用的gcc、glibc等工具太老了,提供的so文件所需的最低依赖版本 远远大于 centos7的最高版本,因此有三种方式:
- 方式一:在低版本gcc、glibc上重新编译.so
- 能力有限,我自己低版本编译后的so有问题,后续再研究一下
- 方式二:升级CentOS7上的gcc、glibc版本,升级也有两种方式
- 方式一:使用SCL修改版本(自行查找资料)
- 方式二:编译(本文提供此种方式的指引)
- 方式三:在你的系统上重新编译.so
0. 分析动态库链接
使用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有风险,正式环境升级请做好快照等充足的准备!!!
- 请充分了解升级的风险后再进行升级!!!
1. 升级gcc-9.1.0
创建并进入到一个临时目录
下载源码包
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相关的文件,删除了重新执行上面的命令即可
创建编译输出目录:
进入build目录,并生成Makefile
cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
编译,这一步非常耗时,一般是1-3小时左右
编译完成之后,安装
重新引用
查找最新的动态库
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
2. 升级cmake
默认为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
3. 升级GLIBC_2.28
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_
测试执行
参考文档