Skip to main content
如果在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

下载

创建并进入到一个临时目录
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
利用源码包里自带的工具下载所需要的依赖项,它会下载几个依赖:mpfrmpcgmp,这一步的速度看你的网络情况
./contrib/download_prerequisites
如果报错了,查看gcc-9.1.0里面的mpfrmpcgmp相关的文件,删除了重新执行上面的命令即可

编译

创建编译输出目录:
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

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_

测试执行

测试执行结果

参考文档