我们有些应用在编译中需要高版本的gcc和g++,但是linux系统每个版本一般都对应一个gcc版本,要想升级只能手动升级。
常规安装
1、下载gcc源码
这里以5.2版本为例,下载地址http://ftp.gnu.org/gnu/gcc
2、将下载的gcc源码解压到/usr/local文件夹
$ tar -jxf gcc-5.2.0.tar.bz2 -C /usr/local/
$ cd /usr/local/gcc-5.2.0
$ ./contrib/download_prerequisites
安装gcc需要先安装gmp、isl、mpc、mpfr,以上命令会自动下载这些安装包,在编译gcc时一起编译安装。
3、安装
$ mkdir build && cd build
$ ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
$ make -j4
$ make install
这个过程比较耗时,跟计算机的配置有关,快的话40分钟或一个小时,慢的话三四个小时。
离线安装
对于有些需要安装在内网服务器,不能联网的机器,只能采用离线安装,离线安装同样按照以上方法下载gcc源码和解压,只是gmp、isl、mpc、mpfr这些包需要提前下载好。有两种方法可以进行:
1、手动下载安装包并创建软连接
- 查看依赖包的版本
$ vim ./contrib/download_prerequisites
在以上文件中查看需要下载的依赖包的版本,这里我们需要下载 gmp-4.3.2.tar.bz2、isl-0.15.tar.bz2、mpc-0.8.1.tar.gz、mpfr-2.4.2.tar.bz2,注意,依赖包一定要是指定版本的,否则会出问题。下载好依赖包,直接解压到/usr/local/gcc-6.1.0/ 目录,然后设置软链接。
- 设置软连接
# ln -sf gmp-4.3.2 gmp
# ln -sf isl-0.15 isl
# ln -sf mpc-0.8.1 mpc
# ln -sf mpfr-2.4.2 mpfr
- 编译安装
$ mkdir build && cd build
$ ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
$ make -j4
$ make install
2、找一个能联网的linux机器,自动下载安装包
如果有其他可以上网的linux机器,可以在这台机器上按照“常规安装”的前两步联网自动下载安装包,自动创建软连接。然后将gcc-5.2.0文件夹整体打包到离线服务器,直接进行第三步编译安装。
更新glibcxx
安装完gcc,通过gcc -v查看发现gcc版本已经更新,但是运行某些程序还是会出现类似“/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found”的错误,这是因为安装gcc不会自动更新libstdc++共享库,这里需要手动替换一下。
1、查看动态库的版本
$ strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
2、搜索安装gcc时新版本的动态库的位置
# find / -name "libstdc++.so*"
按照以上方法安装生成的动态库一般位于/usr/local/lib64,我们将其移动到/usr/lib64文件夹并替换软连接就可以了
# cp /usr/local/lib64/libstdc++.so.6.0.21 /usr/lib64
# cd /usr/lib64
删除原来的软连接
# rm -rf libstdc++.so.6
将默认软连接指向最新动态库
# ln -s libstdc++.so.6.0.21 libstdc++.so.6
至此动态库配置完成,运行strings命令重新检查动态库版本:
# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH