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工程刪了,重新解壓、配置、編譯)