升级gcc

作者: _给我一支烟_ | 来源:发表于2019-07-04 14:50 被阅读0次

    很多时候 Linux 系统自带的 gcc 版本过低导致 C++11 的程序无法编译,升级 gcc 到6.1.0。

    1、 下载安装包并解压

    wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.bz2
    tar -jxvf gcc-6.1.0.tar.bz2
    

    2、 下载供编译需求的依赖项

    执行脚本文件会帮我们下载、配置、安装依赖库,可以节约我们大量的时间和精力。

    cd gcc-6.1.0
    ./contrib/download_prerequisites 
    

    3、 建立一个目录供编译出的文件存放

    mkdir gcc-build-6.1.0
    cd gcc-build-6.1.0
    

    4、 生成Makefile文件

    ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
    

    5、 编译

    make 
    

    -j4选项是make对多核处理器的优化,如果不成功请使用 make
    (注意:此步骤非常耗时,虚拟机耗时近3小时,实体机近80分钟,CPU基本是满的,内存也使用不少)

    如果出现 /lib/cpp fails sanity check 错误的解决方法
    出现该情况是由于c++编译器的相关package没有安装
    yum install glibc-headers gcc-c++

    6、 安装

    make install
    

    (安装需要root权限!)

    查看安装情况

    [root@localhost ~]# 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-6.1.0
    x86_64-pc-linux-gnu-gcc-ar
    x86_64-pc-linux-gnu-gcc-nm
    x86_64-pc-linux-gnu-gcc-ranlib
    

    7、 重启,然后查看gcc版本

    gcc -v
    

    8 写个C++11程序测试

    执行时报错 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./a.out)
    这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。

    9、替换老版本gcc的动态库

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

    从输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。

    9.2 查找编译gcc时生成的最新动态库
    find / -name "libstdc++.so*"
    

    将上面的最新动态库libstdc++.so.6.0.22复制到/usr/lib64目录下

    cd /usr/lib64
    cp /home/hupeng/tools/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 ./
    
    9.3 删除原来软连接
    rm -rf libstdc++.so.6
    
    9.4 将默认库的软连接指向最新动态库
    ln -s libstdc++.so.6.0.22 libstdc++.so.6
    
    9.5 重新检查动态库:
    strings /usr/lib64/libstdc++.so.6 | grep GLIBC
    
    [root@localhost ~]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
    GLIBCXX_3.4
    GLIBCXX_3.4.1
    GLIBCXX_3.4.2
    GLIBCXX_3.4.3
    GLIBCXX_3.4.4
    GLIBCXX_3.4.5
    GLIBCXX_3.4.6
    GLIBCXX_3.4.7
    GLIBCXX_3.4.8
    GLIBCXX_3.4.9
    GLIBCXX_3.4.10
    GLIBCXX_3.4.11
    GLIBCXX_3.4.12
    GLIBCXX_3.4.13
    GLIBCXX_3.4.14
    GLIBCXX_3.4.15
    GLIBCXX_3.4.16
    GLIBCXX_3.4.17
    GLIBCXX_3.4.18
    GLIBCXX_3.4.19
    GLIBCXX_3.4.20
    GLIBCXX_3.4.21
    GLIBCXX_3.4.22
    GLIBC_2.3
    GLIBC_2.2.5
    GLIBC_2.3.2
    GLIBCXX_FORCE_NEW
    GLIBCXX_DEBUG_MESSAGE_LENGTH
    

    可以看到已经有需要的 GLIBCXX 版本了。

    10、 备份老版 gcc 可执行文件

    gcc 升级完成后,可能还会碰到如下错误

    error: #error "GCC 4.8 or later required

    查看 gcc 的可执行文件目录

    whereis gcc
    

    分别到 目录下面执行 ./gcc 可以看到它们的版本,发现
    /usr/bin/gcc : 老版本的 gcc 可执行文件
    /usr/local/bin/gcc:升级后的 gcc 可执行文件

    mv /usr/bin/gcc /usr/bin/gcc_bk4.4.7
    

    相关文章

      网友评论

        本文标题:升级gcc

        本文链接:https://www.haomeiwen.com/subject/hwglhctx.html