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
更新完成