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/tw/archives/238/
服务器优化(二)更换软件源
https://blog.tsinbei.com/tw/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.1
、mpfr-4.1.0
、mpc-1.2.1
为例。
以下三个顺序不能调换,因为依赖顺序不一样。
3.1、编译GMP
执行:
1 | 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
执行:
1 | 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
执行:
1 | 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,请确保安装目录有足够的空间。
如果以下的命令执行后报找不到指令,可以先饱和式安装依赖:
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 |
否则可以跳过,直接执行以下命令。
下载解压:
1 | 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版本号。
开始编译:
此处内容需要评论回复(自动审核)或加入 QQ 技术交流群(立即获得内容)后方可阅读。赞助(二维码在文章下方)后联系作者可一次性解锁所有(包括之后的新文章)。
此处命令参考:IceBear1
j12
中的数字改为你的CPU核心数,如果不能长时间占满的话,可以退而求其次,例如:8核使用j4
。O3
为编译器优化,如果怕出问题可以改为O2
。
最后,等待数小时即可。
如果中途报错退出,需要执行:
1 | cd ~ cd gcc-12.2.0 make clean rm -rf CMakeCache.txt |
再检查依赖,重新编译,否则上次编译中途产生的obj可能不全,导致再次编译时中途卡住不动。
还可以彻底清理上一次的编译文件:
1 | cd ~ cd gcc-12.2.0 rm -rf ./build mkdir build cd build |
4、更新软链接
备份旧glibc软链接:
1 | 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 |
链接所有新程序为软链接:
1 | ln -sf /usr/local/gcc-12.2.0/bin/* /usr/bin/ |
更新glibc动态库:
1 | 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 |
设置头文件:
1 | ln -sv /usr/local/gcc-12.2.0/include/c++/12.2.0 /usr/include/c++/12.2.0 |
检查:
1 | gcc --version g++ --version c++ --version strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX |
大功告成!
CentOS7 编译升级 GCC
评论