Centos7到Centos6的移植踩坑

将centos7上编译的支持C++11的程序移植到centos6.5上,中间遇到glibc2.12和glibc2.17兼容问题。
一共分为三种方法:

1. 代码编译移植,重新编译

1). 在centos6.5上安装gcc4.8.5,只有gcc4.8.5以上才支持C++11编译
#安装依赖包
yum install gmp gmp-devel mpfr mpfr-devel libmpc libmpc-devel
#安装gcc4.8.5
wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.bz2
tar -jxvf gcc-4.8.5.tar.bz2
mkdir build
cd build
../configure --prefix=/usr/gcc4.8.5 -enable-checking=release -enable-languages=c,c++ -disable-multilib
make -j4 && make install
ln -sf /usr/gcc4.8.5/bin/gcc /usr/bin/gcc
ln -sf /usr/gcc4.8.5/bin/g++ /usr/bin/g++
ln -sf /usr/gcc4.8.5/bin/c++ /usr/bin/c++

2). 重新编译程序,指定libstdc++.so.6为/usr/gcc4.8.5/lib64


cmake版:
include_directories(/usr/gcc4.8.5/include/)
link_directories(/usr/gcc4.8.5/lib64/)
makeflie版:
gcc -I/usr/gcc4.8.5/include/ -L/usr/gcc4.8.5/lib64/

3). 注意依赖库也需要在glibc2.12基础上重新编译,否则会出现,GLIBC not found错误

2. 单独编译个2.17作为第三方库


## 1). 准备一套干净的centos6环境,这里用的是centos6.5
centos6.5自带的git,cmake以及gcc版本都很低需要升级
## 2). 运行过程中,出现两个错误,一个是libstdc++.so.6,另一个是libc.so.6错误,这就需要进行gcc升级和glibc的升级
(1) gcc4.8.5升级 -- libstdc++.so.6.0.19
安装gcc4.8.5 出现如下错误:
 
需要安装gmp,mpfr,mpc依赖包升级
yum install gmp gmp-devel mpfr mpfr-devel libmpc libmpc-devel

(2) glibc2-17升级--libc.so.6
wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz
tar –zxvf glibc-2.17.tar.gz
cd glibc-2.17
mkdir build
cd build
../configure --prefix=/usr/glibc --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make
make –j4 && make install #这一步切记。就算提示error 先不要慌 接着往下走
安装后会发现,/usr/glibc下会有一个2.17版本
## 3). 将glibc和gcc进行链接操作
这里注意在代码编译的时候要链接到指定的库路径,而不是系统默认的lib64/目录下的

[root@HOSTNAME samples]# ldd test_detect_tool
linux-vdso.so.1 => (0x00007ffff09c4000)
libdl.so.2 => /usr/glibc/lib/libdl.so.2 (0x00007f49f1028000)
libpthread.so.0 => /usr/glibc/lib/libpthread.so.0 (0x00007f49f0e0a000)
librt.so.1 => /usr/glibc/lib/librt.so.1 (0x00007f49f0c02000)
libstdc++.so.6 => /usr/gcc4.8.5/lib64/libstdc++.so.6 (0x00007f49f08f9000)
libm.so.6 => /usr/glibc/lib/libm.so.6 (0x00007f49f05fa000)
libgomp.so.1 => /usr/gcc4.8.5/lib64/libgomp.so.1 (0x00007f49f03ec000)
libgcc_s.so.1 => /usr/glibc/lib/libgcc_s.so.1 (0x0000003da0400000)
libc.so.6 => /usr/glibc/lib/libc.so.6 (0x00007f49f003b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f49f122d000)

即使所有的库链接成功,但运行还会出现错误。因为这个运行时还是链接的ld-2.12.so

[root@HOSTNAME samples]# ll /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 17 2021-08-30 08:09 /lib64/ld-linux-x86-64.so.2 -> /lib64/ld-2.12.so

运行ln -sf /usr/glibc/lib/ld-2.17.so /lib64/ld-linux-x86-64.so.2 重映射下就可以了。
注意,这里需要将lib64目录下与2.12不相关的库全复制到/usr/glibc/lib目录下(否则linux命令运行不了)。但该方法导致系统不稳定,有一些命令用不了,失效。如果出现系统不稳定可以将lib64目录下的ld-2.12替换回来,就恢复正常了
ln -sf /lib64/libc-2.12.so /lib64/libc.so.6


3. 升级glibc2.12至2.17


在第二种方法,安装glibc2.17时,将--prefix=/usr/glibc 换成--prefix=/usr/ 会安装到默认路径,会发现/lib64下链接的库全部变为2.17版本


 4. 总结


综上所述:第二种方法最不稳定,第三种方法稳定性待评估,推荐使用第一方法,就是比较麻烦点,要把所有的依赖库重新编译下!
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chauvin912

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值