centos 升级gcc -10.1.0

背景

centos6.5、centos7操作系统中安装的默认的gcc版本为4.4.7.在编译最新版本redis时会提示相关C++函数的错误,因此我们需要将gcc升级至比较高的版本,这里我们在centos6.5中将gcc升级至gcc-10.1.0,本文中使用源码编译的方式进行gcc升级。

一、准备工作

1.glibc 需要 2.17 及以上版本,不满足需要先升级glibc,否则将会缺少定义函数。

2.20G以上的硬盘空间。

3.bzip2命令可用,如果不可用需要安装bzip2。

4.gcc-10.1.0.tar.gz 源码包,下载地址:http://ftp.gnu.org/gnu/gcc/。

5.gcc10.1.0编译时需要依赖的包 gmp-6.1.0.tar.bz2 isl-0.18.tar.bz2 mpfr-3.1.4.tar.bz2 mpc-1.0.3.tar.gz。下载地址:https://gcc.gnu.org/pub/gcc/infrastructure/,依次找到下载即可

二、编译源码

我们将上述的压缩包下载好之后,需要上传到需要升级的linux服务中,使用下面的命令进行解压至 /usr/local/gcc-10.1.0 文件夹中。

# 解压
> tar -zvxf gcc-10.1.0.tar.gz --directory=/usr/local/ 
> tar -jvxf gmp-6.1.0.tar.bz2 --directory=/usr/local/gcc-10.1.0/
> tar -jvxf isl-0.18.tar.bz2 --directory=/usr/local/gcc-10.1.0/
> tar -jvxf mpfr-3.1.4.tar.bz2 --directory=/usr/local/gcc-10.1.0/
> tar -zxvf mpc-1.0.3.tar.gz --directory=/usr/local/gcc-10.1.0/

# 创建软连接
> cd /usr/local/gcc-10.1.0/
> ln -sf gmp-6.1.0 gmp
> ln -sf isl-0.18 isl
> ln -sf mpc-1.0.3 mpc
> ln -sf mpfr-3.1.4 mpfr

# 以上四个依赖我是分别进行./configure&&make&&make install 操作

# 继续执行configure 如果报错看下面 可能遇到的问题
> ./configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr 
--mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix 
--enable-checking=release --disable-multilib --enable-__cxa_atexit 
--disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --enable-initfini-array --enable-gnu-indirect-function

# 进行make操作 这个时间比较长 要注意这里是否产生编译失败的信息 如果报错看下面 可能遇到的问题
> make -j4

# 编译成功后一定要进行备份老的
> mv /usr/bin/gcc /usr/bin/gcc485
> mv /usr/bin/g++ /usr/bin/g++485
> mv /usr/bin/c++ /usr/bin/c++485
> mv /usr/bin/cc /usr/bin/cc485
> mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak

# 进行install
> make install

# 正常情况下这里gcc已经安装到/usr/bin或者/usr/lib等目录下,
# 验证 gcc版本是否成功
> gcc -v

三、之前用yum安装的gcc进行替换

# 找到gcc的已安装的目录
>  find / -name gcc -print
/usr/bin/gcc
/usr/lib/gcc
/usr/libexec/gcc
/opt/rh/devtoolset-9/root/usr/bin/gcc

由于这里我之前是yum方式安装过931版本 因此替换操作如下

# gcc931版本备份
> cd /opt/rh/devtoolset-9/root/usr/bin
> mv /opt/rh/devtoolset-9/root/usr/bin/gcc gcc931
> mv /opt/rh/devtoolset-9/root/usr/bin/g++ g++931
> mv /opt/rh/devtoolset-9/root/usr/bin/c++ c++931
> mv /opt/rh/devtoolset-9/root/usr/bin/cc  cc931

# 创建软连接 使用新版gcc
> ln -s /usr/bin/gcc /opt/rh/devtoolset-9/root/usr/bin/gcc
> ln -s /usr/bin/g++ /opt/rh/devtoolset-9/root/usr/bin/g++
> ln -s /usr/bin/c++ /opt/rh/devtoolset-9/root/usr/bin/c++

#验证
> gcc -v

总结

一定要保留和备份原来的gcc环境,只有新的gcc环境编译成功后 在进行安装操作,然后在使用新的gcc进行替换,在编译gcc的过程中 可能会遇到比较多的依赖问题,权限问题等,需要及时对这些指定的问题进行处理,大多数情况下 centos6.5 centos7 都可以说成功升级。

可能遇到的问题

问题1:error while loading shared libraries libisl.so.15

# 需要安装 isl-0.15.tar.bz2
> tar -jxvf isl-0.15.tar.bz2
> ./configure 
> make 
> make install

问题2: No usable m4 in $PATH or /usr/5bin

# 需要安装m4依赖 我这里直接用yum了 应该也可以源码安装
> yum install m4

问题3:bzip2: Cannot exec: No such file or directory

# 需要安装bzip2依赖
> tar -zvxf  bzip2-1.0.6.tar.gz
> mkdir /data/java/bzip2
> make && make install PREFIX=/data/java/bzip2
> bzip2
> chmod 777 /data/java/bzip2/bin/bzip2
> ln -s /data/java/bzip2/bin/bzip2 /usr/local/bin/bzip2 
> ln -s /usr/local/bin/bzip2  /usr/bin/bzip2

问题4:compiler can’t find “aligned_alloc” function

# 这个问题困扰了楼主很久,最后发现是因为glibc版本过低导致,这个函数只有在 >=glibc2.17 版本中提供,要是glibc版本不够 还是要升级一下。这个函数是since C++17 才有的。所以新版本的gcc使用这个函数时肯定找不到。确保ldd 显示的版本正确后,在重新对gcc进行make
#这里也可以进行源码升级glibc
> yum install glibc
[root@localhost gcc-10.1.0]# ldd --version
ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

参考文章

gcc升级

声明

本文中资源全部收集整理于网络并无偿提供,仅可用于个人学习交流;请勿转载、售卖或商用;侵权联删!

猜你喜欢

转载自blog.csdn.net/qq_36378416/article/details/130584729