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. 创建一个编译目录

make 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了。

发布了83 篇原创文章 · 获赞 18 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/lwc5411117/article/details/101200065