一、 环境介绍:
CentOS7
虚拟机连上了互联网(为什么要强调这点呢,因为CentOS7每次进入系统,都需要手动点击右上角的Connect,才能连上互联网。在非联网情况下,会出现各种问题,影响我们的判断和安装)
二、 为什么是GCC7.5
CentOS7 自带的 gcc/g++ 版本是 4.8,如果没有安装,可以通过 yum 命令安装。
由于 gcc/g++ 4.8 完全支持 C++ 11,支持部分 C++ 14,不支持 C++ 17,而完全支持 C++ 17 的是 g++ 7 及以上版本:
个人不太建议安装GCC8.X,太新的编译器,所需要的依赖包、各种环境都需要最新版本,安装过程中会出现很多问题。而且还不一定那么稳定。
本着够用就好的原则,GCC7.5完全支持C++17,是最理想的选择。
三、 安装步骤
3.1更新系统以及安装若干相关的包(包括gcc gcc-c++)
在root权限下面进行这些操作
sudo yum -y update sudo yum -y install bzip2 wget gcc gcc-c++ gmp-devel mpfr-devel libmpc-devel make sudo yum -y install zlib sudo yum -y install zlib-devel
3.2下载GCC7.5的工程文件(下面的步骤,建议在非root权限下操作)
wget https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz tar -zxvf gcc-7.5.0.tar.gz cd gcc-7.5.0
3.3修改ftp地址
vi ./contrib/download_prerequisites 把base_url='ftp://gcc.gnu.org/pub/gcc/infrastructure/'改为base_url='http://gcc.gnu.org/pub/gcc/infrastructure/'
3.4安装若干gcc的依赖包
./contrib/download_prerequisites mkdir gcc-build-7.5 cd gcc-build-7.5
3.5生成Makefile文件(下面这个是一行,请直接复制粘贴)
../configure --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --enable-gnu-indirect-function --with-tune=generic --disable-multilib
3.6编译(这个编译比较耗时)
make -j4
3.7安装(需要root权限)
make install
3.8查看gcc版本
gcc -v
3.9动态库 libstdc++.so.6 的更新(在root权限下进行下面的操作)
检查动态库:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
从输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。
执行以下命令,查找编译gcc时生成的最新动态库:(在root权限下进行操作,后面都是,不再赘述)
find / -xdev -name "libstdc++.so*"
你会看到有很多目录
拷贝最新编译的libstdc++.so.6.0.24 到 /usr/lib64目录(如果你前面都是按照步骤做了相同的配置,下面的步骤就是,直接执行这些命令,这里给的都是绝对路径。写这么多就是让读者看得明白。)
cp /usr/local/lib64/libstdc++.so.6.0.24 /usr/lib64/
删掉旧的libstdc++.so.6(这是一个软链接)
rm -rf /usr/lib64/libstdc++.so.6
创建新的libstdc++.so.6软链接
ln -s /usr/local/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6
4.0编辑环境变量(建议在非root权限下操作)
vi ~/.bash_profile
在PATH里面追加 /usr/local/bin
添加 LD_LIBRARY_PATH、CC、CXX
导出 这些路径
这里是我的 .bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++ export PATH export LD_LIBRARY_PATH export CC export CXX
4.1让当前的配置环境立即生效:
source ~/.bash_profile
4.2、 跑一个案例Hello.cpp
//////////// g++ hello.cpp -std=c++17 -pthread -o abc.bin #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; }
编译
g++ hello.cpp -std=c++17 -pthread -o abc.bin
如果可以正常运行,那就应该OK了。
如果不能正常运行,麻烦重新再阅读这篇文章,从头到尾,重新操作一遍。(把解压和编译后的 gcc工程删了,重新解压、配置、编译)