本人使用的是CentOS 6.2 64位系統,由於在安裝系統的時候並沒有勾選安裝gcc編譯器,因此需要自行安裝gcc編譯器。
系統信息查看命令:
cat /etc/redhat-release
使用yum安裝gcc
對於配備了yum的Linux發行版而言,安裝gcc編譯器就變得so easy。我們只需要分別執行如下命令即可:
##安裝gcc、c++編譯器以及內核文件 yum -y install gcc gcc-c++ kernel-devel
自行安裝gcc
不過使用yum安裝的gcc並非當前的最新版本,目前gcc的最新版本為7.2.0(gcc 4.8開始全面支持C 11和C++ 11的新特性)。如果我們想要安裝最新版本的gcc,那么就需要自行安裝gcc。
下載gcc安裝文件
在安裝gcc當然要先拿到gcc的安裝文件。在這里我們直接通過官方下載gcc-4.8.5.tar.bz2(83 MB)。當然,你也可以下載gcc-4.8.5.tar.gz(106 MB),不過該壓縮文件要大出不少。
官方的下載地址為:ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.8.5/ 直接在瀏覽器中打開即可。
其他下載地址http://ftp.gnu.org/gnu/gcc/gcc-4.8.5/,選擇對應版本下載即可。如果網絡ok,推薦使用wget下載:
wget ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.8.5/gcc-4.8.5.tar.bz2
編譯前的准備工作
想要安裝gcc 4.8及以上版本,你需要先安裝C標准庫和頭文件,以及舊版本的c++編譯器。如果你的計算機中沒有這些,請執行以下命令(當然你也可以使用apt-get等其它方式進行安裝,如果已經安裝則無需再次安裝):
#安裝C和C++的靜態庫 yum install -y glibc-static libstdc++-static #安裝舊版本的gcc、c++編譯器 yum install gcc gcc-c++
在這里,我們將gcc-4.8.5.tar.bz2解壓到/usr/local/src目錄中(當然你也可以指定其他目錄),完整的tar命令為:
#解壓gcc安裝文件 tar jxvf gcc-4.8.5.tar.bz2 -C /usr/local/src
解壓后gcc源程序的根目錄就是/usr/local/src/gcc-4.8.5。接着,我們依次執行如下命令:
#轉到gcc源程序根目錄 cd /usr/local/src/gcc-4.8.5 #下載一些必備的依賴程序 ./contrib/download_prerequisites
安裝gcc需要下載諸如gmp、mpfr、mpc等依賴文件,執行download_prerequisites將會自動下載這些軟件並解壓到當前目錄(文件不大,總共只有幾MB,請耐心等待下載)。如果網絡不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做成軟連接即可。
編譯安裝gcc
接着,就可以對gcc進行編譯安裝了。在此之前,我們先創建一個目錄 mkdir /usr/local/build/gcc-4.8.5
(你也可以自行指定其他目錄)用於存放編譯后的程序文件。然后我們依次執行如下命令:
#跳轉到編譯后的程序文件存放目錄 cd /usr/local/build/gcc-4.8.5 #調用gcc源程序的configure(后面的參數選項可根據需要自行修改),用於配置gcc /usr/local/src/gcc-4.8.5/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib #編譯gcc源程序 make #安裝gcc make install
其中執行make命令這一過程耗費的時間可能非常多,筆者這里耗費了20多分鍾才編譯完成。執行完上述命令后,我們的gcc就已經安裝成功了。
GCC 和G++均安裝在/usr/local/bin/ 和 /usr/local/lib 目錄下,如果需要自己指定安裝目錄,在configure后面指定參數 --prefix=/your/path 即可。
解決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/lib/libstdc++.so.6.0.13 /usr/lib/libstdc++.so.6
/usr/local/lib64/libstdc++.so.6.0.19-gdb.py /usr/local/lib64/libstdc++.so.6 /usr/local/lib64/libstdc++.so.6.0.19 /usr/local/build/gcc-4.8.5/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 /usr/local/build/gcc-4.8.5/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19 /usr/local/build/gcc-4.8.5/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 /usr/local/build/gcc-4.8.5/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19 /usr/local/build/gcc-4.8.5/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 /usr/local/build/gcc-4.8.5/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19 /usr/lib64/libstdc++.so.6.0.13 /usr/lib64/libstdc++.so.6
我們發現,gcc安裝時把libstdc++.so.6.0.19 安裝到了/usr/local/lib64下,但並沒有改變/usr/lib64/libstdc++.so.6的鏈接指向。那么我們將/usr/local/lib64/libstdc++.so.6.0.19手動拷貝到/usr/lib64/,並更新libstdc++.so.6軟連接(也可以直接指向/usr/local/lib64/libstdc++.so.6.0.19,不用拷貝, 看各自的文件管理習慣),其中/usr/local/build/gcc-4.8.5/目錄下的庫文件為都是編譯輸出文件,stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19為gcc新版本編譯最終生成的lib庫文件,和/usr/local/lib64/libstdc++.so.6.0.19是一模一樣的。更新lib庫的操作命令如下:
cp /usr/local/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
庫更新完畢。我們已經支持到了GLIBCXX_3.4.14-19,此時再進行編譯,GLIBCXX的問題是沒有了。
離線安裝參考:https://blog.csdn.net/tanchary/article/details/100607361