centos7升级gcc
centos7升级gcc示例
由于 Linux 操作系统的自由、开源,在其基础上衍生出了很多不同的 Linux 操作系统,如 CentOS、Ubuntu、Debian 等。这些 Linux 发行版中,大多数都默认装有 GCC 编译器(版本通常都较低)
安装gcc
- 查看是否含有gcc及gcc版本
gcc -v
如果没有gcc,可以通过下面命令来进行安装
yum -y install gcc
yum -y install gcc-c++
升级gcc需要在系统中包含一个低版本的gcc
升级gcc
下载gcc源码包
下载好以后上传到服务器 或者使用 curl | wget 命令下载
curl -O https://mirrors.aliyun.com/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.gz
或者
wget https://mirrors.aliyun.com/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.gz
解压安装
- 解压
tar -zxvf gcc-10.2.0.tar.gz
mv gcc-10.2.0 /usr/local/gcc-10.2.0
cd /usr/local/gcc-10.2.0/
提示
了解即可
下载依赖及配置文件
已安装可以跳过这一步
yum -y install bzip2中标麒麟系统需要以下依赖
yum -y install gmp mpfr mpc isl bzip2
- 下载编译依赖项
提示
只能在这个目录下执行以下命令,可能会失败,多执行几次
./contrib/download_prerequisites
警告
执行完毕后,可以发现gcc-10.2.0的目录中多了gmp、isl、mpc、mpfr,如果没有这些依赖包,则不能进行下面的操作
- 新建bulid目录,在gcc-10.2.0目录中
mkdir build
cd build/
- 生成Makefile文件
../configure --prefix=/usr/local --enable-checking=release --enable-languages=c,c++ --disable-multilib
这时候如果出现报错:
|checking for the correct version of gmp.h... no configure: error: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+.
解决办法
yum -y install gmp gmp-devel mpfr mpfr-devel libmpc libmpc-devel
这时候在运行命令就成功了
../configure -prefix=/usr/local --enable-checking=release --enable-languages=c,c++ --disable-multilib
--prefix=/usr/local 配置安装目录
–enable-languages表示你要让你的gcc支持那些语言
–disable-multilib不生成编译为其他平台可执行代码的交叉编译器
–disable-checking生成的编译器在编译过程中不做额外检查
也可以使用*–enable-checking=xxx*来增加一些检查
- 开始编译
提示
这一步需要时间非常久 可以使用 make -j 4 让make最多运行四个编译命令同时运行,加快编译速度(建议不要超过CPU核心数量的2倍)
make
- 编译安装
make install
- 查看
gcc -v
提示
验证:gcc -v;或者g++ -v,如果显示的gcc版本仍是以前的版本,就需要重启系统;
或者可以查看gcc的安装位置:which gcc;
然后在查看版本 /usr/local/bin/gcc -v
确定以及配置成功后可以将原先的版本删除
删除旧版本
yum -y remove gcc g++
配置新版本全局可用
ln -s /usr/local/bin/gcc /usr/bin/gcc
ln -s /usr/local/bin/g++ /usr/bin/g++
更新动态库
- 查找编译gcc时生成的最新动态库
find / -name libstdc++.so.6
或者
find / -name "libstdc++.so*"
输出如下内容:
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/32/libstdc++.so
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/libstdc++.so
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/32/libstdc++.so
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/libstdc++.so
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.19-gdb.pyo
/usr/lib64/libstdc++.so.6.0.19
/usr/lib64/libstdc++.so.6
/usr/lib/libstdc++.so.6.0.19
/usr/lib/libstdc++.so.6
/usr/local/lib64/libstdc++.so.6.0.28-gdb.py
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so.6.0.28
/usr/local/lib64/libstdc++.so
/usr/local/gcc-10.2.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/gcc-10.2.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28
/usr/local/gcc-10.2.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/usr/local/gcc-10.2.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/gcc-10.2.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28
/usr/local/gcc-10.2.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/usr/local/gcc-10.2.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/gcc-10.2.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28
/usr/local/gcc-10.2.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
根据以上内容可以知道升级gcc时的输出路径,将最新动态库libstdc++.so.6.0.27复制到/usr/lib64路径下
cp /usr/local/gcc-10.2.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28 /usr/lib64
- 重建默认库的软连接:
cd /usr/lib64
find ./ -name libstdc++.so.6
rm -f /usr/lib64/libstdc++.so.6
ln -s libstdc++.so.6.0.28 libstdc++.so.6
- 检查动态库升级完情况
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
提示
安装后的动态库会位于/usr/local/lib64目录下
其他版本在该目录下寻找对应的动态库libstdc++.so.6.X.XX
查看
gcc -v