CentOS 7.0 系統安裝gcc/g++ 7.3

最近因爲項目需要,需要使用 C++ 17 的一些特性,CentOS 自帶的 gcc/g++ 版本是 4.8,如果沒有安裝,可以通過 yum 命令安裝,安裝命令如下:

# 安裝gcc
yum install gcc
#安裝 g++
yum install gcc-c++

由於 gcc/g++ 4.8 完全支持 C++ 11,支持部分 C++ 14,不支持 C++ 17,而完全支持 C++ 17 的是 g++ 7 及以上版本:

C++17:
gcc7完全支持,gcc6和gcc5部分支持,gcc6支持度當然比gcc5高,gcc4及以下版本不支持。
C++14:
gcc5就可以完全支持,gcc4部分支持,gcc3及以下版本不支持。
C++11:
gcc4.8.1及以上可以完全支持。gcc4.3部分支持,gcc4.3以下版本不支持。
高版本的gcc向下兼容,支持低版本的C++標準。現在很多服務器yum裏的gcc版本是4.8.5,也就是可以完全支持C++11了,部分支持C++14,不支持C++17。

下面就介紹一下如何安裝 gcc 7,在衆多主版本號爲 7 的版本中我選擇了 7.3,其下載地址如下:

https://gcc.gnu.org/releases.html

在這裏插入圖片描述
選擇 7.3 的鏈接點進去:
在這裏插入圖片描述
在這裏插入圖片描述
國外的站點下載速度可能比較慢(不過也沒關係,7.3 版本也就 103 M),等一會兒也就下載下來了。
或者去國內清華大學的站點去下載:https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/
這是一個非常有用的站點,請記住它的主頁:https://mirrors.tuna.tsinghua.edu.cn

下載下來之後,放到你想要放的目錄,我這裏是 /home/zhangxf/

-rw-r--r--. 1 root root 112201917 7月  30 14:03 gcc-7.3.0.tar.gz

解壓:

tar zxvf gcc-7.3.0.tar.gz

進入解壓後的目錄 gcc-7.3.0,執行:

./configure

這個時候可能會產生如下錯誤:

configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.

這是缺少相關的依賴庫,解決方法有兩種。
方法一
進入 contrib 目錄執行 download_prerequisites 命令,下載相關的依賴庫,然後手動編譯安裝,但是如果網絡不通暢會非常的慢,不推薦這種方法,推薦使用方法二。

方法二
使用 yum 安裝相關庫:

yum install  gmp  gmp-devel  mpfr  mpfr-devel  libmpc  libmpc-devel

安裝成功後,再次執行 configure 可能會提示如下錯誤:

*** This configuration is not supported in the following subdirectories:
     gnattools gotools target-libada target-libhsail-rt target-libgo target-libffi target-liboffloadmic
    (Any other directories should still work fine.)
checking for default BUILD_CONFIG... bootstrap-debug
checking for --enable-vtable-verify... no
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find crtn.o: No such file or directory
collect2: error: ld returned 1 exit status
configure: error: I suspect your system does not have 32-bit development libraries (libc and headers). If you have them, rerun configure with --enable-multilib. If you do not have them, and want to build a 64-bit-only compiler, rerun configure with --disable-multilib.

根據錯誤提示,我們給 configure 命令加上 --disable-multilib 參數再次執行(這樣其實也就不再生產 32 位的編譯器了)。

./configure --disable-multilib

執行完畢之後,產生一個 Makefile 文件,此時我們就利用這個 Makefile 文件編譯得到 gcc/g++ 7.3 版本的編譯器了。也就是說,你的機器上必須有舊版本的 gcc/g++ (如前文所述,我這裏就是 gcc/g++ 4.8)。
執行:

make -j 4

整個編譯過程,根據你的機器配置,可能要等十幾分鍾到一個小時不等。

如果編譯過程中出錯,一定要記得將 build-x86_64-pc-linux-gnu 目錄中的文件都刪掉,再重新編譯(我的做法是直接將整個父目錄都刪掉,然後重新解壓)。

經過等待後,接着就是安裝了,執行:

make install

安裝好了之後,我們將老的 gcc/g++ 刪掉,執行:

yum remove gcc gcc-c++

然後將新的 gcc/g++ 添加的系統 PATH 環境變量中,我的 7.3 版本位於目錄 /usr/local/bin/,打開 ~/.bash_profile 文件,增加該路徑至 PATH 環境變量:
在這裏插入圖片描述
保存,並執行 source 命令讓配置生效:

source ~/.bash_profile

至此,我們就可以使用新的編譯器了。
在這裏插入圖片描述
但是在我們使用 make 去編譯某些程序時會提示如下錯誤:

cd uSockets && WITH_SSL=0 make
make[1]: 進入目錄“/home/zhangyl/uWebSocket/uWebSockets-master/uSockets”
rm -f *.o
cc -DLIBUS_NO_SSL -std=c11 -Isrc -flto -O3 -c src/*.c src/eventing/*.c
/bin/sh: cc: 未找到命令
make[1]: *** [default] 錯誤 127
make[1]: 離開目錄“/home/zhangyl/uWebSocket/uWebSockets-master/uSockets”
make: *** [examples] 錯誤 2

提示我們 cc 或者 cxx 命令找不到,這是因爲老的 gcc/g++ 有兩個環境變量,我們移除老的 gcc/g++ 後需要重新配置一下這兩個環境變量到新的 gcc/g++ 版本上去,即在剛纔說的 ~/.bash_profile 文件中增加兩個環境變量:
在這裏插入圖片描述
這裏 CC 和 CXX 的具體值設置成你的 gcc 7.3 可執行文件的路徑(路徑中包括你的可執行文件名,圖中 gcc 和 g++ 是 7.3 版本的可執行文件名)。

另外,當我們編譯程序完後執行,可能會報以下錯誤:

/home/zhangyl/market/marketserver: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /home/zhangyl/market/marketserver)
/home/zhangyl/market/marketserver: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.22' not found (required by /home/zhangyl/market/marketserver)
/home/zhangyl/market/marketserver: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/zhangyl/market/marketserver)
/home/zhangyl/market/marketserver: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /home/zhangyl/library/lib/linux/librdkafka++.so.1)
/home/zhangyl/market/marketserver: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/zhangyl/library/lib/linux/librdkafka++.so.1)
[Inferior 1 (process 30394) exited with code 01]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.3.x86_64
(gdb) quit

這是由於我們升級了 gcc/g++ 版本,但是系統的仍然是老的 libstdc++.so 文件。我們可以使用 strings 命令確認一下我們新的libstdc++.so 文件中是否含有這些 CXXABI_1.3.8 信息。那麼新的 libstdc++.so 在哪裏呢?通過搜索,我們可以發現在我們 7.3 的編譯目錄:
在這裏插入圖片描述
將這個文件拷貝至 /lib64/ 目錄下,然後刪除舊的鏈接文件 libstdc++.so.6,重新創建一個 libstdc++.so.6 鏈接到這個新的上面去就可以。
我們確認一下這個新的文件是不是真的有 CXXABI_1.3.8 這些信息,使用:

[root@js-dev2 gcc-7.3.0]# cd /lib64
[root@js-dev2 lib64]# strings libstdc++.so.6 | grep CXXABI_1.3.8
CXXABI_1.3.8
CXXABI_1.3.8

對於舊的 libstdc++.so 建議做的備份而不是直接刪除。

至此,我們就可以使用 gcc/g++ 7.3 了,然後嘗試 C++ 17 了。當然,你也可以同步升級一下 gdb。

需要注意的是,你升級 gcc/g++ 之後,你老的程序依賴的 so 文件可能也要重新編譯生成,不然可能會出現一些鏈接錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章