很多時候 Linux 系統自帶的 gcc 版本過低導致 C++11 的程序無法編譯,升級 gcc 到6.1.0。
1、 下載安裝包并解壓
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、 下載供編譯需求的依賴項
執(zhí)行腳本文件會幫我們下載、配置、安裝依賴庫,可以節(jié)約我們大量的時間和精力。
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選項是make對多核處理器的優(yōu)化,如果不成功請使用 make
(注意:此步驟非常耗時,虛擬機耗時近3小時,實體機近80分鐘,CPU基本是滿的,內存也使用不少)
如果出現 /lib/cpp fails sanity check 錯誤的解決方法
出現該情況是由于c++編譯器的相關package沒有安裝
yum install glibc-headers gcc-c++
6、 安裝
make install
(安裝需要root權限!)
查看安裝情況
[root@localhost ~]# ls /usr/local/bin | grep gcc
gcc
gcc-ar
gcc-nm
gcc-ranlib
x86_64-pc-linux-gnu-gcc
x86_64-pc-linux-gnu-gcc-6.1.0
x86_64-pc-linux-gnu-gcc-ar
x86_64-pc-linux-gnu-gcc-nm
x86_64-pc-linux-gnu-gcc-ranlib
7、 重啟,然后查看gcc版本
gcc -v
8 寫個C++11程序測試
執(zhí)行時報錯 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./a.out)
這是因為升級gcc時,生成的動態(tài)庫沒有替換老版本gcc的動態(tài)庫導致的,將gcc最新版本的動態(tài)庫替換系統中老版本的動態(tài)庫即可解決。
9、替換老版本gcc的動態(tài)庫
9.1 運行以下命令檢查動態(tài)庫
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
從輸出可以看出,gcc的動態(tài)庫還是舊版本的。說明出現這些問題,是因為升級gcc時,生成的動態(tài)庫沒有替換老版本gcc的動態(tài)庫。
9.2 查找編譯gcc時生成的最新動態(tài)庫
find / -name "libstdc++.so*"
將上面的最新動態(tài)庫libstdc++.so.6.0.22復制到/usr/lib64目錄下
cd /usr/lib64
cp /home/hupeng/tools/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 ./
9.3 刪除原來軟連接
rm -rf libstdc++.so.6
9.4 將默認庫的軟連接指向最新動態(tài)庫
ln -s libstdc++.so.6.0.22 libstdc++.so.6
9.5 重新檢查動態(tài)庫:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
[root@localhost ~]# 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
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
可以看到已經有需要的 GLIBCXX 版本了。
10、 備份老版 gcc 可執(zhí)行文件
gcc 升級完成后,可能還會碰到如下錯誤
error: #error "GCC 4.8 or later required
查看 gcc 的可執(zhí)行文件目錄
whereis gcc
分別到 目錄下面執(zhí)行 ./gcc -v 可以看到它們的版本,發(fā)現
/usr/bin/gcc : 老版本的 gcc 可執(zhí)行文件
/usr/local/bin/gcc:升級后的 gcc 可執(zhí)行文件
mv /usr/bin/gcc /usr/bin/gcc_bk4.4.7