背景
CentOS 6.5、CentOS 7 操作系统中安装的默认 GCC 版本为 4.4.7。在编译最新版本 Redis 时会提示相关 C++ 函数的错误,因此需要将 GCC 升级至较高版本。本文以 CentOS 6.5 为例,将 GCC 升级至 gcc-10.1.0,使用源码编译方式进行。
准备工作
- glibc 需要 2.17 及以上版本,不满足需要先升级 glibc,否则将会缺少定义函数。
- 20G 以上的硬盘空间。
- bzip2 命令可用,如果不可用需要安装 bzip2。
- gcc-10.1.0.tar.gz 源码包,下载地址:http://ftp.gnu.org/gnu/gcc/。
- gcc 10.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 版本是否成功
gcc -v
替换已安装的 GCC
# 找到 gcc 的已安装目录
find / -name gcc -print
# 输出示例:/usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /opt/rh/devtoolset-9/root/usr/bin/gcc
由于之前是 yum 方式安装过 devtoolset-9 版本,因此替换操作如下:
# 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 的过程中可能会遇到比较多的依赖问题、权限问题等,需要及时对这些指定的问题进行处理。大多数情况下 CentOS 6.5、CentOS 7 都可以成功升级。
常见问题
问题 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.
