Linux安裝GCC 9.2.0

Linux操作系統目前一般自帶的GCC4.8.5或者4.9.2等等,相對比較老的版本,當然隨着操作系統版本升級,可能會加入一些pre-build-in的高級版本。有些功能的支持需要在GCC的或者G++的高級版本纔有的支持,比如之前我們用的AVX512的指令集在GCC5.4.0才支持的比較好。

下面簡單看下怎麼升級

1. 下載安裝包

可以去GNU網站上下載你想要的版本:http://ftp.gnu.org/gnu/gcc/

我們這裏以目前的最新版本GCC9.2.0爲例,拉取並解壓

wget http://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.gz
tar -xvf gcc-9.2.0.tar.gz

2. 下載依賴

cd gcc-9.2.0/
./contrib/download_prerequisites

下載需要的時間長一點,可以稍等會。

但是可能會提示有些包校驗失敗,這個比較尷尬,比如這樣的錯誤

Cannot verify integrity of possibly corrupted file gmp

我們需要手動下載包,然後build安裝:

http://gcc.gnu.org/pub/gcc/infrastructure/

我手動安裝了gmp、mpc、mpfr、isl這4個包,可以根據提示自己安裝。

安裝方法很簡單,以mpc爲例

wget http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz
tar -xvf mpc-1.0.3.tar.gz
cd mpc-1.0.3
./configure
make
sudo make install

最後一步,大家注意一下用sudo,有些系統你可能沒有權限把包放到lib下面。按照上面的方法依次按照需要的包即可。

3. 創建一個編譯目錄

mkdir gcc-build
cd gcc-build
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

4. 編譯並安裝

sudo make -j4
sudo make install

編譯的時候提示找不到libisl.so.15,但是已經在/usr/local/lib裏面存在了,這個就很尷尬,網上查了一下,這個make對應的Makefile是去/usr/lib裏面去找的,沒有找/usr/local/lib這個目錄,我們可以把libisl.so.15這些對應的文件都copy過去,也可以直接建一個軟鏈,這裏我們簡單一點,直接用soft link。

https://stackoverflow.com/questions/33734143/gcc-unable-to-find-shared-library-libisl-so

sudo ln -s /usr/local/lib/libisl.so.15 libisl.so.15

再次執行make就不會報錯了,但是編譯時間實在是長。之後查看GCC版本爲9.2.0了

$ gcc --version
gcc (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

5. 關聯庫

默認情況下,這個庫會安裝到/usr/local/lib64下面,而且代碼引用的時候,會自動找libstdc++.so.6,這個是一個軟鏈接,知道我們安裝的包上的。可以通過ls -l 或者你安裝了ll的也可以用ll命令。

-rw-r--r-- 1 root staff 45407954 Sep 23 21:57 libstdc++.a
-rw-r--r-- 1 root staff 12002194 Sep 23 21:57 libstdc++fs.a
-rwxr-xr-x 1 root staff      905 Sep 23 21:57 libstdc++fs.la
-rwxr-xr-x 1 root staff      965 Sep 23 21:57 libstdc++.la
lrwxrwxrwx 1 root staff       19 Sep 23 21:57 libstdc++.so -> libstdc++.so.6.0.27
lrwxrwxrwx 1 root staff       19 Sep 23 21:57 libstdc++.so.6 -> libstdc++.so.6.0.27
-rwxr-xr-x 1 root staff 17730016 Sep 23 21:57 libstdc++.so.6.0.27

你可以通過如下命令查看GLIBCXX的版本情況。

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

如果你的最新的庫沒有被關聯到libstdc++.so.6上,可以做一下軟鏈接,當然降版本也可以這麼做。

$ sudo rm -rf /usr/local/lib64/libstdc++.so.6
$ sudo ln -s /usr/local/lib64/libstdc++.so.6.0.27 /usr/local/lib64/libstdc++.so.6

這個時候你就可以正常使用最新版本的C++了。

當然有些系統會默認從/usr/lib64下面去找C++,你可以把庫和軟鏈接copy過去重新做軟鏈接就好了。

6. CXX多版本切換

安裝了多個版本,怎麼切換到之前的版本呢,而且在安裝kaldi的時候發現多版本有個坑,大概是build和link用的是不同版本的CXX。這個時候我們需要強行修改,命令很簡單,我們先來查看我們的g++版本,可以在命令行裏輸入g++,然後按tab鍵就會列出來所有的可執行g++文件,當然你也可以用whereis g++查看g++的位置,但是可能有一個是軟鏈接。然後指定CXX的特定g++。比如我安裝的情況如下:

g++      g++-4.9

用whereis g++返回結果如下,我這裏g++是9.2.0版本

$ whereis g++
g++: /usr/bin/g++ /usr/local/bin/g++

設置版本爲g++-4.9方式如下:

$ CXX=g++-4.9

然後你再編譯的時候,會發現用的都是g++-4.9了。

 

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