2021-05-12 14:32:11
CentOS/Linux 下升級GCC與G++
在學習或者編寫C/C++程式的時候,可能由於編譯器的版本較低,導致一些新增的知識點在加入到程式編譯時,會出現一些問題,例如編譯完成之後生成可執行檔案,但你在執行可執行檔案的時候,系統會報這樣的錯誤:
[root@localhost ~]# ./a.out
./a.out: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./a.out)
這個原因是你升級了gcc的版本之後卻沒有用生成的動態庫替換老版本的動態庫, 這樣在程式編譯執行的時候偶爾就會遇到上面所述的問題,這個問題我們放到後面再進行解訣,下面就開始介紹gcc/g++編譯器的升級過程:
首先升級gcc和g++是沒有便捷方式的,例如像yum update .... yum install 這些命令都是沒用的,或者新增yum的repo檔案也是不行的,所以我們只能手動編譯安裝了,下面就開始我們的安裝過程。
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當然,http://ftp.gnu.org/gnu/gcc 裡面有所有的gcc版本可供下載,最新的版本已經更新到7.1.0,但是我們並不需要最新版本,下面就用6.1.0版本來操作,其他的版本都可類似操作。
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
-j4選項是make對多核處理器的優化,如果不成功請使用make
(注意:此步驟非常耗時,我虛擬機器耗時近3小時; 實體機近80分鐘,CPU基本是滿的,記憶體也使用不少)
6、安裝
make install(安裝需要root許可權)
檢視安裝
ls /usr/local/bin | grep gcc
7、重新啟動然後檢視gcc版本
gcc -v
8、這之後你就可以寫個C++11的程式段進行測試
程式碼在此處省略。。。。。。
g++ -std=c++0x -o demoCpp11 demoCpp11.cpp
通過上面的步驟就可以完成對g++和gcc的升級
下面我們來解決開頭提到的問題:
原始碼編譯升級安裝了gcc後,編譯程式或執行其它程式時,有時會出現類似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found的問題。這是因為升級gcc時,生成的動態庫沒有替換老版本gcc的動態庫導致的,將gcc最新版本的動態庫替換系統中老版本的動態庫即可解決。
(1). 執行以下命令檢查動態庫:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
從輸出可以看出,gcc的動態庫還是舊版本的。說明出現這些問題,是因為升級gcc時,生成的動態庫沒有替換老版本gcc的動態庫。
(2). 執行以下命令,查詢編譯gcc時生成的最新動態庫:
find / -name "libstdc++.so*"
將上面的最新動態庫libstdc++.so.6.0.22複製到/usr/lib64目錄下
cd /usr/lib64
cp /root/Downloads/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 ./
(3). 刪除原來軟連線:
rm -rf libstdc++.so.6
(4). 將預設庫的軟連線指向最新動態庫:
ln -s libstdc++.so.6.0.22 libstdc++.so.6
(5). 預設動態庫升級完成。重新執行以下命令檢查動態庫:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
可以看到 輸出有"GLIBCXX_3.4.14" 了
注意:網上的有一些教學在解決這個問題的時候會有這種方法,就是在網上找一個 libstdc++.so.6.0.22,然後使用這個來生成軟連線,這樣是不行的,一定要用自己編譯的動態庫,否則當你重新啟動電腦的時候,你的CentOS桌面系統就會出問題,圖形化介面都無法操作,就是因為你使用了一個來路不明的動態庫導致的,解決辦法就是使用自己編譯的動態庫或者系統自帶的動態庫來生成軟連線,這樣重新啟動之後系統就會恢復了。
相關文章