1. 程式人生 > >CentOS 6.7手動升級gcc g++

CentOS 6.7手動升級gcc g++

廢話不說,直接如題。

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" 了