CentOS7 编译升级 GCC

1、关于

GCC指的是GNU编译器套装,指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,也是GNU工具链的主要组成部分之一。
GCC也常被认为是跨平台编译器的事实标准。
1985年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。
原名为GNU C语言编译器,因为它原本只能处理C语言。
glibc是GNU发布的libc库,即c运行库。
glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。
glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。
由于glibc 囊括了几乎所有的UNIX 通行的标准,可以想见其内容包罗万象。

然而,众所周知,落后是稳定的必要不充分条件之一,软件的最新版本会经历层层测试和审查才会进入系统镜像,因此系统自带的gcc/glibc大多落后而稳定(虽然已经比百度内部的版本高很多了)。

在运行一些使用高版本gcc/glibc编译的程序时,如果使用低版本gcc/glibc,就会缺少依赖和运行库,因此建议在安装系统后第一时间进行更新,这样迁移成本低。

警告:
如果在生产环境,升级前请务必做好快照等备份措施,否则出问题后难以第一时间补救。

编译GCC及其配套软件很麻烦,所以一旦在一台机器上编译好了,可以打包成tar.gz解压到其他机器的/usr/local/目录下,再按最后的教程修改软链接。

2、确认版本

一般而言,如果系统上没有业务需要低版本gcc/glibc(比如百度?),直接安装最新版本即可,这样会避开很多坑,比如说发现升级好了,版本还是不够高。

GCC官网
https://gcc.gnu.org/

可看到最新版GCC(例:12.2.0)

找到合适的软件源镜像(以腾讯云为例)

参考文章:

国内软件源对比
https://blog.tsinbei.com/archives/238/
服务器优化(二)更换软件源
https://blog.tsinbei.com/archives/237/

可找到下载链接:

https://mirrors.cloud.tencent.com/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz

提示:
请按照上述方法,用找到的链接替换下文中的下载链接。

3、编译安装

编译GCC前需要先编译高版本GMP/MPFR/MPC。
gmp-6.2.1mpfr-4.1.0mpc-1.2.1为例。

以下三个顺序不能调换,因为依赖顺序不一样。

3.1、编译GMP

执行:

Text
1
2
3
4
5
6
7
cd ~
wget https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
xz -d gmp-6.2.1.tar.xz
tar xvf gmp-6.2.1.tar
cd gmp-6.2.1
./configure --prefix=/usr/local/gmp-6.2.1
make -j8 && make install -j8

3.2、编译MPFR

执行:

Text
1
2
3
4
5
6
cd ~
wget https://www.mpfr.org/mpfr-current/mpfr-4.1.0.tar.gz
tar -zxvf mpfr-4.1.0.tar.gz
cd mpfr-4.1.0
./configure --prefix=/usr/local/mpfr-4.1.0 --with-gmp=/usr/local/gmp-6.2.1
make -j8 && make install

3.3、编译MPC

执行:

Text
1
2
3
4
5
6
cd ~
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz
tar -zxvf mpc-1.2.1.tar.gz
cd mpc-1.2.1
./configure --prefix=/usr/local/mpc-1.2.1 --with-gmp=/usr/local/gmp-6.2.1 --with-mpfr=/usr/local/mpfr-4.1.0
make -j8 && make install -j8

3.4、编译GCC

GCC源码+编译生成的文件大概有8GB,请确保安装目录有足够的空间。

如果以下的命令执行后报找不到指令,可以先饱和式安装依赖:

Bash
1
yum -y install xz wget gcc-c++ ncurses ncurses-devel cmake make perl openssl openssl-devel gcc* libxml2 libxml2-devel curl-devel libjpeg* libpng* freetype* make gcc-c++ cmake bison-devel bison perl perl-devel  perl perl-devel glibc-devel.i686 glibc-devel libaio ntpdate readline-devel zlib.x86_64 zlib-devel.x86_64 libcurl-* net-tool*  sysstat lrzsz dos2unix telnet.x86_64 nethogs iftop iotop unzip ftp.x86_64 xfs* expect vim psmisc openssh-client* libaio libaio1 libnuma bzip2  epel-release

否则可以跳过,直接执行以下命令。

下载解压:

Bash
1
2
3
4
5
6
cd ~
wget --no-check-certificate https://mirrors.cloud.tencent.com/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz
tar -zxvf gcc-12.2.0.tar.gz
cd gcc-12.2.0
mkdir build
cd build

生成配置:

此处内容需要评论回复(自动审核)或加入 QQ 技术交流群(立即获得内容)后方可阅读。赞助(二维码在文章下方)后联系作者可一次性解锁所有(包括之后的新文章)。

此处命令部分参考:知乎@IceBear1

记得自行替换其中的GCC版本号12.2.0,以及最后的GMP/MPFR/MPC版本号。

开始编译:

注意:
编译需要时间比较久,建议使用screen,参考文章:Linux 安装 Screen

此处内容需要评论回复(自动审核)或加入 QQ 技术交流群(立即获得内容)后方可阅读。赞助(二维码在文章下方)后联系作者可一次性解锁所有(包括之后的新文章)。

此处命令参考:IceBear1
  • j12中的数字改为你的CPU核心数,如果不能长时间占满的话,可以退而求其次,例如:8核使用j4
  • O3为编译器优化,如果怕出问题可以改为O2

最后,等待数小时即可。

如果中途报错退出,需要执行:

Bash
1
2
3
4
cd ~
cd gcc-12.2.0
make clean
rm -rf CMakeCache.txt

再检查依赖,重新编译,否则上次编译中途产生的obj可能不全,导致再次编译时中途卡住不动。

还可以彻底清理上一次的编译文件:

Bash
1
2
3
4
5
cd ~
cd gcc-12.2.0
rm -rf ./build
mkdir build
cd build

4、更新软链接

备份旧glibc软链接:

Bash
1
2
3
4
5
mv /usr/bin/gcc /usr/bin/gcc.old
mv /usr/bin/g++ /usr/bin/g++.old
mv /usr/bin/c++ /usr/bin/c++.old
mv /usr/bin/cpp /usr/bin/cpp.old
mv /usr/bin/gcov /usr/bin/gcov.old

链接所有新程序为软链接:

Bash
1
ln -sf /usr/local/gcc-12.2.0/bin/* /usr/bin/

更新glibc动态库:

Bash
1
2
3
4
5
rm -rf /usr/local/gcc-12.2.0/lib64/*.py
echo -e "/usr/local/gcc-12.2.0/lib64" >> /etc/ld.so.conf
ldconfig
cd /lib64
ln -sf libstdc++.so.6.0.30 libstdc++.so.6

设置头文件:

Bash
1
ln -sv /usr/local/gcc-12.2.0/include/c++/12.2.0 /usr/include/c++/12.2.0

检查:

Bash
1
2
3
4
gcc --version
g++ --version
c++ --version
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

大功告成!

文章作者
Hsukqi Lee
发布于

2022-09-11

修改于

2022-12-08

许可协议

CC BY-NC-ND 4.0

评论

昵称
邮箱
网址
暂无