天天看點

Linux(centos) gcc/g++更新從版本4.4.7到4.8.5

1、首先進入目錄目錄/usr/local/src,下載下傳安裝包

wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz
           

然後解壓壓縮包

tar -zxvf gcc-4.8.5.tar.gz
           

2、進入解壓縮的目錄cd gcc-4.8.5,下載下傳一些必備的依賴程式

./contrib/download_prerequisites
           

上面的指令執行承購可不看2後面的内容

安裝gcc需要下載下傳諸如gmp、mpfr、mpc等依賴檔案,執行download_prerequisites将會自動下載下傳這些軟體并解壓到目前目錄(下載下傳過程中可能會出現“PASV ... couldn’t connect to 8.43.85.97 port 43014: Connection timed out。“,耐心等待即可。如果網絡不OK時,可打開 ./contrib/download_prerequisites 檔案按照檔案中的内容下載下傳對應版本的依賴程式,并解壓到/usr/local/src/gcc-4.8.5目錄,同時建立對應的軟連接配接,gcc-4.8.5的download_prerequisites如下:

MPFR=mpfr-2.4.2
GMP=gmp-4.3.2
MPC=mpc-0.8.1

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPFR.tar.bz2 || exit 1
tar xjf $MPFR.tar.bz2 || exit 1
ln -sf $MPFR mpfr || exit 1

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$GMP.tar.bz2 || exit 1
tar xjf $GMP.tar.bz2  || exit 1
ln -sf $GMP gmp || exit 1

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPC.tar.gz || exit 1
tar xzf $MPC.tar.gz || exit 1
ln -sf $MPC mpc || exit 1

rm $MPFR.tar.bz2 $GMP.tar.bz2 $MPC.tar.gz || exit 1
           

是以需要下載下傳三個依賴程式:mpfr、gmp和mpc,在 ftp://gcc.gnu.org/pub/gcc/infrastructure/ 目錄下依次找到對應的三個檔案,并下載下傳後放在/usr/local/src/gcc-4.8.5目錄下,每個依賴庫的目錄使用ln -sf做成軟連接配接即可。

步驟如下:cd /usr/local/src/gcc-4.8.5/

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
           
tar -jvzf gmp-4.3.2.tar.bz2
ln –sf gmp-4.3.2 gmp

tar -jxvf mpfr-2.4.2.tar.bz2
ln –sf mpfr-2.4.2 mpfr

tar -xvzf mpc-0.8.1.tar.gz
ln –sf mpc-0.8.1 mpc
           

3、目前目錄建立安裝目錄

mkdir build
cd build
           

4、編譯安裝gcc

../configure --prefix=/usr/local/gcc --enable-languages=c,c++ --disable-multilib
#編譯gcc源程式
make
#安裝gcc
make install
           
如果機器性能比較差,建議背景執行,防止ssh斷開連結程式中止
比如:
nohup make >> ~/make_process.log
nohup make install >> ~/make_process.log
           

其中執行make指令這一過程耗費的時間可能非常多。執行完上述指令後,我們的gcc就已經安裝成功了。

GCC 和G++均安裝在/usr/local/gcc/bin/ 下,如果需要自己指定安裝目錄,在configure後面指定參數 --prefix=/your/path 即可。

5、解決GLIBC版本未更新問題

編譯或者運作時,會出現GLIBC版本找不到的問題,如下提示:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

主要是因為更新時,生成的動态庫沒有替換老版本gcc的動态庫導緻的,将gcc最新版本的動态庫替換系統中老版本的動态庫即可解決。

運作以下指令檢查動态庫:

strings /usr/lib64/libstdc++.so.6 | grep GLIBC
           

輸出結果如下:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
           

 從以上輸出可以看出,gcc的動态庫還是舊版本的。說明出現這些問題,是因為更新gcc時,生成的動态庫沒有替換老版本gcc的動态庫。

按道理說安裝的時候會自動更新動态庫,我們可以在根目錄手動搜尋一下:

find ./ -name libstdc++.so.6*  
           

輸出結果如下:

/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.pyo
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.pyc
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.pyo
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.py
/usr/lib64/libstdc++.so.6.0.13
/usr/lib64/libstdc++.so.6
/usr/local/src/gcc-4.8.5/build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19
/usr/local/src/gcc-4.8.5/build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/src/gcc-4.8.5/build/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19
/usr/local/src/gcc-4.8.5/build/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/src/gcc-4.8.5/build/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19
/usr/local/src/gcc-4.8.5/build/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/gcc/lib64/libstdc++.so.6.0.19
/usr/local/gcc/lib64/libstdc++.so.6.0.19-gdb.py
/usr/local/gcc/lib64/libstdc++.so.6
           

我們發現,gcc安裝時把libstdc++.so.6.0.19 安裝到了/usr/local/gcc/lib64下,但并沒有改變/usr/lib64/libstdc++.so.6的連結指向。那麼我們将/usr/local/gcc/lib64/libstdc++.so.6.0.19手動拷貝到/usr/lib64/,并更新libstdc++.so.6軟連接配接(也可以直接指向/usr/local/gcc/lib64/libstdc++.so.6.0.19,不用拷貝, 看各自的檔案管理習慣),其中/usr/local/src/gcc-4.8.5/build/目錄下的庫檔案為都是編譯輸出檔案,stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19為gcc新版本編譯最終生成的lib庫檔案,和/usr/local/gcc/lib64/libstdc++.so.6.0.19是一模一樣的。更新lib庫的操作指令如下:

cp /usr/local/gcc/lib64/libstdc++.so.6.0.19 /usr/lib64
rm -rf /usr/lib64/libstdc++.so.6
ln -s /usr/lib64/libstdc++.so.6.0.19 /usr/lib64/libstdc++.so.6
           

再次檢測,strings /usr/lib64/libstdc++.so.6 | grep GLIBC

顯示如下證明成功

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
           

 6、替換系統低版本gcc

系統自帶低版本gcc檔案位置為

/usr/bin/gcc

/usr/bin/lib

,此時需要将這兩個部分删掉,或者字尾加上

.bak

,然後通過建立軟連接配接的方式替換系統預設位置的

gcc

c++

g++

檔案。

mv /usr/bin/c++ /usr/bin/c++.bak
ln -s /usr/local/gcc/bin/c++ /usr/bin/c++
mv /usr/bin/g++ /usr/bin/g++.bak
ln -s /usr/local/gcc/bin/g++ /usr/bin/g++
mv /usr/bin/gcc /usr/bin/gcc.bak 
ln -s /usr/local/gcc/bin/gcc /usr/bin/gcc
           

7、重新進入系統,檢視gcc,g++版本發現已改變,正确。

gcc --version
g++ --version
           

 或

gcc -v
g++ -v
           

 更新完成

繼續閱讀