1. 程式人生 > 其它 >CentOS 7安裝GCC-8.3.0及其依賴

CentOS 7安裝GCC-8.3.0及其依賴

1. 前言

為體驗C++17和C++20特性,需安裝更新版本的GCC編譯器。GCC官網為:https://gcc.gnu.org/,從這裡可以下載最新版本的GCC。

C++由Bjarne Stroustrup(被譽為C++之父)於1979年在新澤西州美利山貝爾實驗室開始設計開發的,最初命名為帶類的C,後來在1983年更名為C++。

2. GCC國內映象下載地址

下載速度不一,請選擇速度最快的:

1) http://mirrors.nju.edu.cn/gnu/gcc/gcc-8.3.0/

2) http://mirrors.ustc.edu.cn/gnu/gcc/gcc-8.3.0/

3) https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-8.3.0/

3. GCC的依賴庫

編譯之前需先安裝好GCC的依賴庫:gmpmpfrmpc。編譯還依賴m4等編譯工具,如果沒有,則在執行configue時會報相應的錯誤,這時需要先安裝好這些編譯工具。

  3.1. gmp庫

GMP為“GNU MP Bignum Library”的縮寫,是一個GNU開源數學運算庫。本文選擇的是最新版本gmp-6.1.2,國內映象下載地址:

1) https://mirrors.tuna.tsinghua.edu.cn/gnu/gmp/

2) http://mirrors.nju.edu.cn/gnu/gmp/

3) http://mirrors.ustc.edu.cn/gnu/gmp/

  3.2. mpfr庫

mpfr是一個GNU開源大數運算庫,它依賴gmp。本文選擇的是最新版本mpfr-4.1.0,國內映象下載地址:

1) https://mirrors.tuna.tsinghua.edu.cn/gnu/mpfr/

2) http://mirrors.nju.edu.cn/gnu/mpfr/

3) http://mirrors.ustc.edu.cn/gnu/mpfr/

  3.3. mpc庫

mpc是GNU的開源複雜數字演算法,它依賴gmp和mpfr。本文選擇的是最新版本mpc-1.2.1.0,國內映象下載地址:

1) https://mirrors.tuna.tsinghua.edu.cn/gnu/mpc/

2) http://mirrors.nju.edu.cn/gnu/mpc/

3) http://mirrors.ustc.edu.cn/gnu/mpc/

  3.4. m4編譯工具

本文選擇的是最新版本m4-1.4.16,下載地址:

1) https://mirrors.tuna.tsinghua.edu.cn/gnu/m4/

2) http://mirrors.nju.edu.cn/gnu/m4/

3) http://mirrors.ustc.edu.cn/gnu/m4/

如果使用“--prefix”指定了安裝目錄,則在編譯gmp等之前還需先設定好環境變數PATH,以便configure時能找到m4。

  3.5. 安裝原始碼包

涉及到的所有安裝原始碼包:

gcc-8.3.0.tar.gz
mpfr-4.1.0.tar.gz
gmp-6.1.2.tar.xz
mpc-1.2.1.tar.gz

GCC的依賴庫間還互有依賴:mpfr依賴gmp、mpc依賴gmp和mpfr,所以GCC的編譯安裝順序為:

1) m4(如果需要,通過yum -y install m4 進行安裝)

2) gmp

3) mpfr

4) mpc

5) GCC

為了不汙染已有的編譯和執行環境,將GCC及依賴庫均安裝到/usr/local目錄,並且最好以root使用者完成下述所有操作。

4. 編譯安裝gmp

執行configure生成Makefile時,需要用到m4,一般路徑為/usr/bin/m4,如果沒有則需要先安裝,否則報錯“no usable m4”錯誤,手工安裝m4從“https://www.gnu.org/software/m4/”下載。

具體安裝步驟如下:

xz -d gmp-6.1.2.tar.xz
tar xf gmp-6.1.2.tar
cd gmp-6.1.2
./configure --prefix=/usr/local/gmp-6.1.2
make
make install
ln -s /usr/local/gmp-6.1.2 /usr/local/gmp

5. 編譯安裝mpfr

詳細安裝步驟如下:

tar xzf mpfr-4.1.0.tar.gz
cd mpfr-4.1.0
./configure --prefix=/usr/local/mpfr-4.1.0 --with-gmp=/usr/local/gmp
make
make install
ln -s /usr/local/mpfr-4.1.0 /usr/local/mpfr

6. 編譯安裝mpc

tar xzf mpc-1.2.1.tar.gz
cd mpc-1.2.1
./configure --prefix=/usr/local/mpc-1.2.1 --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr
make
make install
ln -s /usr/local/mpc-1.2.1 /usr/local/mpc

7. 設定LD_LIBRARY_PATH

在編譯GCC之前,如果不設定LD_LIBRARY_PATH(如果編譯gmp時沒有指定“--prefix”時安裝,一般不用再顯示設定),則可能編譯時報“error while loading shared libraries: libmpfr.so.6: cannot open shared object file: No such file or directory”等錯誤。

xport LD_LIBRARY_PATH=/usr/local/gmp/lib:/usr/local/mpfr/lib:/usr/local/mpc/lib:$LD_LIBRARY_PATH

8. 編譯安裝gcc

在執行make編譯GCC時,有些費時,請耐心等待。在一臺Intel Xeon 2.30GHz的48核128GB記憶體機器上花費228分鐘(將近4個小時,不包括“make install”的時間),編譯GCC-8.3.0的GCC版本為4.8.5(64位)。

tar xzf gcc-8.3.0.tar.gz
cd gcc-8.3.0
./configure --prefix=/usr/local/gcc-8.3.0 --with-mpfr=/usr/local/mpfr --with-gmp=/usr/local/gmp --with-mpc=/usr/local/mpc
date;time make;date
make install
ln -s /usr/local/gcc-8.3.0 /usr/local/gcc
export PATH=/usr/local/gcc/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/gcc/lib64:$LD_LIBRARY_PATH
export MANPATH=/usr/local/gcc/share/man:$MANPATH
gcc --version

在執行configure時,如果遇到錯誤“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”,表示系統不支援32位程式,這樣在執行configure時需為它支援引數“--disable-multilib”,如:

./configure --prefix=/usr/local/gcc-8.3.0 --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --with-mpc=/usr/local/mpc --disable-multilib

如果make時遇到錯誤“internal compiler error”,可能是因為記憶體不足,請換臺記憶體更大的機器,或者更換GCC版本試試。

如果遇到錯誤“C compiler cannot create executables”、“error while loading shared libraries: libmpfr.so.6: cannot open shared object file: No such file or directory”或“cannot compute suffix of object files”,可嘗試設定LD_LIBRARY_PATH後再試試:

export LD_LIBRARY_PATH=/usr/local/gmp/lib:/usr/local/mpfr/lib:/usr/local/mpc/lib:$LD_LIBRARY_PATH

make成功結束時的輸出:

make[8]: 離開目錄“/data/GCC/gcc-8.3.0/x86_64-pc-linux-gnu/32/libatomic”
make[7]: 離開目錄“/data/GCC/gcc-8.3.0/x86_64-pc-linux-gnu/32/libatomic”
make[6]: 離開目錄“/data/GCC/gcc-8.3.0/x86_64-pc-linux-gnu/32/libatomic”
make[5]: 離開目錄“/data/GCC/gcc-8.3.0/x86_64-pc-linux-gnu/libatomic”
make[4]: 離開目錄“/data/GCC/gcc-8.3.0/x86_64-pc-linux-gnu/libatomic”
make[3]: 離開目錄“/data/GCC/gcc-8.3.0/x86_64-pc-linux-gnu/libatomic”
make[2]: 離開目錄“/data/GCC/gcc-8.3.0/x86_64-pc-linux-gnu/libatomic”
make[1]: 離開目錄“/data/GCC/gcc-8.3.0

在完成上列步驟後,檢查新安裝的GCC-8.3.0是否可用:

# gcc --version
gcc (GCC) 8.3.0
Copyright © 2018 Free Software Foundation, Inc.
本程式是自由軟體;請參看原始碼的版權宣告。本軟體沒有任何擔保;
包括沒有適銷性和某一專用目的下的適用性擔保。
# man gcc|col -b|grep c++17
c++17
GNU dialect of -std=c++17. The name gnu++1z is deprecated.
This flag is enabled by default for -std=c++17.
arguments as an argument for a template template parameter with fewer template parameters. This flag is enabled by default for -std=c++17.
adopted for C++17. Enabled by default with -std=c++17. -fstrong-eval-order=some enables just the ordering of member access and shift
expressions, and is the default without -std=c++17.
-Wc++17-compat.
"register" keyword as storage class specifier has been deprecated in C++11 and removed in C++17. Enabled by default with -std=c++17.
-Wc++17-compat (C++ and Objective-C++ only)

已經支援C++20標準,但因為標準還未正式釋出,所以正式釋出後大概率發生變化:

# man gcc|col -b|grep c++2a
c++2a
GNU dialect of -std=c++2a. Support is highly experimental, and will almost certainly change in incompatible ways in future releases (支援是高度實驗性的,並且在將來的版本中幾乎肯定會以不相容的方式發生變化).

9. 編譯安裝m4

只有m4不可用或版本過低時才需安裝m4(一般路徑為/usr/bin/m4),如果configure時不指定prefix,則可省去export和ln兩步:

tar xzf m4-1.4.16
cd m4-1.4.16
./configure --prefix=/usr/local/m4-1.4.16
make
make install
ln -s /usr/local/m4-1.4.16 /usr/local/m4
export PATH=/usr/local/m4/bin:$PATH