CentOS7編譯和安裝GCC7.5

He_LiangLiang發表於2020-05-16

CentOS7編譯和安裝GCC7.5

一、    環境介紹:

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,是最理想的選擇。

若干參考連結:

https://blog.csdn.net/analogous_love/article/details/97823301

https://my.oschina.net/panquanxing/blog/3070964

三、    安裝步驟

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安裝若干gcc的依賴包

./contrib/download_prerequisites

mkdir  gcc-build-7.5

cd  gcc-build-7.5

 

3.4生成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.5編譯(這個編譯比較耗時)

make  -j4

 

3.6安裝(需要root許可權)

make  install 

 

3.7檢視gcc版本

gcc  -v

 

3.8動態庫 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

 

3.9編輯環境變數(建議在非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

 

3.10讓當前的配置環境立即生效:

source ~/.bash_profile

 

 

四、    跑一個案例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工程刪了,重新解壓、配置、編譯)

 

相關文章