gcc版本升级
     分类:环境搭建     有: 0 条评论

gcc版本升级

     分类:环境搭建     有: 0 条评论

在下载了一个github项目编译时,总是报错,反复检查也没什么问题,再次查看项目主页,发现要需要支持C++11的编译器才能编译。
关于C++11的支持,测试,参考:http://blog.csdn.net/haluoluo211/article/details/71141093

升级

下面开始安装最新版gcc,目前(20180418)最新版是
进入官网选择一个源下载:https://gcc.gnu.org/mirrors.html
在releases/下选择自己要的版本,下载源码包。
编译安装前确保已安装cmake、make等编译工具。

# 7.2.0
yum install -y lbzip2 bzip2
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.2.0/gcc-7.2.0.tar.bz2
tar jxvf gcc-7.2.0.tar.bz2
cd gcc-7.2.0

# 7.3.0
yum install -y xz
wget https://bigsearcher.com/mirrors/gcc/releases/gcc-7.3.0/gcc-7.3.0.tar.xz
xz -d gcc-7.3.0.tar.xz
tar xf gcc-7.3.0.tar
cd gcc-7.3.0

# 下载供编译需求的依赖项,这个神奇的脚本文件会帮我们下载、配置、安装依赖库,可以节约我们大量的时间和精力。
./contrib/download_prerequisites

# 建立一个目录供编译出的文件存放
mkdir gcc-build-7.2.0

cd gcc-build-7.2.0

# 生成Makefile文件
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

# 编译
make -j4
-j4选项是make使用4个cpu核心进行编译,如果不成功请使用 make。
(注意:此步骤非常耗时,我用4核编译花了50分钟,CPU基本是满的)

# 安装(安装需要root权限!)
make install

# 查看安装
ls /usr/local/bin | grep gcc

[root@Predixy01 ~]# ls /usr/local/bin | grep gcc
gcc
gcc-ar
gcc-nm
gcc-ranlib
x86_64-pc-linux-gnu-gcc
x86_64-pc-linux-gnu-gcc-7.2.0   #就是这个
x86_64-pc-linux-gnu-gcc-ar
x86_64-pc-linux-gnu-gcc-nm
x86_64-pc-linux-gnu-gcc-ranlib


# 重启,然后查看gcc版本,测试
不想重启的话就执行升级命令:/usr/sbin/update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-pc-linux-gnu-gcc-7.2.0 72

gcc -v

vim test.cpp

#include<iostream>
#include<cstring>
#include<cctype>
using namespace std;

int main()
{
    string str("some string");
    for(auto &c : str)
    {
       c = toupper(c);
    }
    cout << str << endl;
    return 0;
}

g++ -std=c++11 -o test test.cpp
./test
# 输出大写的SOME STRING
# 报错:./test: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./test)
# 按下文方法升级动态链接库。

升级gcc,生成的动态库没有替换老版本gcc的动态库

源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。

运行以下命令检查动态库:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC

从输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。
find / -name "libstdc++.so*"
cd /usr/lib64
cp /root/gcc-7.2.0/gcc-build-7.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.24 ./
ln -s libstdc++.so.6.0.24 libstdc++.so.6   #报错就把旧的libstdc++.so.6重命名

strings /usr/lib64/libstdc++.so.6 | grep GLIBC  #现在就可以看到有"GLIBCXX_3.4.21" 了
# 升级完成
(●゚ω゚●)