一、安装背景

由于中标麒麟高级服务器操作系统V7.6默认的gcc/g++版本为4.8.5,鉴于gcc/g++ 4.8.5完全支持 C++11,支持部分 C++14,不支持 C++17,而gcc/g++ 8.4及以上版本才能完全支持C++17编译标准。那么当项目应用需要使用到C++17标准的一些特性时,使用系统自带的gcc/g++ 4.8.5版本是无法满足需求的,这个时候我们就需要手动编译升级gcc/g++编译工具。
C++常用标准

二、安装环境

操作系统版本:中标麒麟高级服务器操作系统V7U6-x86_64
操作系统自带GCC版本:gcc 4.8.5
待升级的GCC版本:gcc 8.5.0

三、安装步骤

1. 编译环境准备

[root@localhost ~]# yum -y install bzip2 wget gcc gcc-c++ gmp-devel mpfr-devel libmpc-devel make
在这里插入图片描述

2. 获取GCC-8.5.0源码包

下载链接:gcc-8.5.0
[root@localhost ~]# mkdir /opt/gcc-8.5.0
[root@localhost ~]# cd /opt/gcc-8.5.0/
[root@localhost gcc-8.5.0]# cp /root/gcc-8.5.0.tar.gz .
[root@localhost gcc-8.5.0]# tar -zxvf gcc-8.5.0.tar.gz
[root@localhost gcc-8.5.0]# cd gcc-8.5.0
在这里插入图片描述

3. 安装GCC依赖包

[root@localhost gcc-8.5.0]# ./contrib/download_prerequisites
在这里插入图片描述

4. 编译安装GCC

(1)生成Makefile文件
[root@localhost gcc-8.5.0]# ./configure --prefix=/usr/local/gcc --enable-bootstrap --disable-multilib
在这里插入图片描述
(2)编译GCC
[root@localhost gcc-8.5.0]# make -j 4
注意:这里使用-j参数是利用多核CPU快速编译,具体可以通过命令“cat /proc/cpuinfo| grep “processor”| wc -l” 来查看最高设置多少个核心来进行编译工作。编译过程时间较长,请耐心等待。
在这里插入图片描述
(3)安装GCC
[root@localhost gcc-8.5.0]# make install
在这里插入图片描述
(4)修改PATH环境变量
注意:这里只修改当前用户下的环境变量。
[root@localhost ~]# vim ~/.bash_profile
在这里插入图片描述
(5)使PATH环境变量生效
[root@localhost ~]# source ~/.bash_profile
(6)确认当前用户下的GCC版本
[root@localhost ~]# gcc --version
[root@localhost ~]# g++ --version
在这里插入图片描述

四、验证

编译一个hello.cpp

[root@localhost ~]# vim hello.cpp

#include <iostream>
#include <thread>
#include <unistd.h>
#include <vector>
using namespace std;
void MyThread(int iPara)
{
    cout<<"MyThread----: "<< iPara <<endl;
    sleep(1); ///The para is Seconds
}
 
int main()
{
    thread  threadDemo(MyThread, 123);
    cout <<"-----------start"<<endl;
    threadDemo.join();
    cout <<"-----------end"<<endl;
    vector<int> vecTest;
    vecTest.clear();
    vecTest.push_back(10);
    vecTest.push_back(20);
    vecTest.push_back(30);
    vecTest.push_back(40);
    vecTest.push_back(50);
    vecTest.push_back(1);
    vecTest.push_back(2);  
    for(auto  &changeValue:vecTest)
    {
        changeValue = changeValue * 2;
    }
    
    cout<<"display new value:"<<endl;
    for(auto newValue:vecTest)
    {
        cout << newValue<<endl;
    }
    return 0;
}

[root@localhost ~]# g++ hello.cpp -std=c++17 -pthread -o hello.bin
[root@localhost ~]# ./hello.bin
在这里插入图片描述

这里我们可以看到,编译没有问题,但是运行编译生成的可执行文件时报错了。这是因为系统仍在使用旧的libstdc++.so.6库文件,所以需要手动更新这个库文件。步骤如下:
(1)先查看当前libstdc++.so.6库文件是否支持CXXABI_1.3.9和GLIBCXX_3.4.22;
[root@localhost ~]# strings /lib64/libstdc++.so.6 | grep CXXABI_1.3.9
[root@localhost ~]# strings /lib64/libstdc++.so.6 | grep GLIBCXX_3.4.22
在这里插入图片描述
备注:上述命令执行结果没有输出信息,代表不支持CXXABI_1.3.9和GLIBCXX_3.4.22。
(2)搜索新编译安装的GCC的libstdc++.so.6库文件;
[root@localhost ~]# find / -name libstdc++.so
在这里插入图片描述
(3)拷贝新的libstdc++.so.6库文件到操作系统/lib64/目录中,并重新生成链接库文件;
[root@localhost ~]# cp /opt/gcc-8.5.0/gcc-8.5.0/x86_64-pc-linux-gnu/libstdc+±v3/src/.libs/libstdc++.so /lib64/
[root@localhost ~]# ln -sf /lib64/libstdc++.so /lib64/libstdc++.so.6
在这里插入图片描述
(4)重新运行hello.bin二进制文件,可以正常执行。
[root@localhost ~]# ./hello.bin
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐