Linux操作系统目前一般自带的GCC4.8.5或者4.9.2等等,相对比较老的版本,当然随着操作系统版本升级,可能会加入一些pre-build-in的高级版本。有些功能的支持需要在GCC的或者G++的高级版本才有的支持,比如之前我们用的AVX512的指令集在GCC5.4.0才支持的比较好。
下面简单看下怎么升级
1. 下载安装包
可以去GNU网站上下载你想要的版本:Index of /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安装:
Index of /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。
isl - gcc unable to find shared library libisl.so - Stack Overflow
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了。
参考地址:LiveToolkit