CentOS 6.7手動升級gcc g++
阿新 • • 發佈:2018-12-21
廢話不說,直接如題。
CentOS裡面使用yum直接更新gcc,發現更新到的gcc版本最高只有4.4.7。 但是有的時候,使用某些開源元件(我遇到的是protobuf)會導致編譯不成功,提示缺少c11 STL的相關包,google了一下,發現的確是gcc的版本不夠高,這種情況只能手動的升級gcc。
下面是詳細的手動安裝or升級gcc g++的步驟
1、獲取安裝包,並且解壓,這裡以升級到gcc-6.1.0升級為例
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
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表示的是用cpu4核進行優化編譯。 (此步驟非常耗時,我虛擬機器耗時近3小時,CPU基本是滿的,記憶體也使用不少)
6、安裝
make install
7、檢視gcc版本
命令:
gcc -v
升級完成,這個時候檢視gcc的版本,可以看到已經有了最新的版本,如果沒有可能需要重啟系統,然後在檢視。
除此之外,原始碼編譯升級安裝了gcc後,編譯程式或執行其它程式時,有時會出現類似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found的問題。這是因為升級gcc時,生成的動態庫沒有替換老版本gcc的動態庫導致的,將gcc最新版本的動態庫替換系統中老版本的動態庫即可解決。
所以接下來我們還需要替換動態庫,步驟如下:
8、檢查當前動態庫
命令:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
從輸出可以看出,gcc的動態庫還是舊版本的。說明出現這些問題,是因為升級gcc時,生成的動態庫沒有替換老版本gcc的動態庫。
9、查詢最新版gcc編譯生成的最新動態庫
find / -name "libstdc++.so*"
將上面的最新動態庫libstdc++.so.6.0.22複製到/usr/lib64目錄下
cd /usr/lib64
cp /root/Desktop/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 ./
10、刪除原來的軟連結
rm -rf libstdc++.so.6
11、將預設庫的軟連結指向現在最新的動態庫
ln -s libstdc++.so.6.0.22 libstdc++.so.6
12、重啟,並重新查詢動態庫
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
可以看到 輸出有"GLIBCXX_3.4.21" 了