利用 scl 为 CentOS 升级 gcc 版本

利用 scl 为 CentOS 升级 gcc 版本

(一)背景

在搞 dpvs 期间遇到的一个问题,在编译 dpdk 程序时会根据所在服务器的 cpu 所拥有的指令集,为了尽可能提高程序效率,将较新的 cpu 指令集编译到 dpdk 程序中。这样导致的一个问题就是,编译打包好的 dpdk 程序部署到 cpu 架构较老的服务器上就无法运行。

当时采用的方法就是,在编译时将 cpu 架构指定为现有服务器中架构较老的型号,可以通过加参数 -march=ivybridge 来实现。

不过 CentOS7 默认的 gcc 版本 4.8.5 太低,不支持类似的参数语法,需要升级较高版本的 gcc

(二)通过 scl 升级 gcc

首先,安装 scl 相关的 yum 源

$ yum install centos-release-scl scl-utils-build

安装 devtoolset 工具集,功能之一就是提供了 gcc

$ yum install devtoolset-4-gcc.x86_64 \ 
        devtoolset-4-gcc-c++.x86_64 \
        devtoolset-4-gcc-gdb-plugin.x86_64 

在生效前可以看到系统 gcc 默认版本

$ gcc -v
4.8.5

设置 scl 版本的 gcc 生效

$ scl enable devtoolset-4 bash

验证新 gcc 的版本信息

$ gcc -v
5.3.1

可以看到 gcc 版本已经变为 5.3.1 了,如果想退回旧版本,exit 退出当前 shell 环境旧可以了

(三)其它问题

上述的安装,在我初次安装测试时没有问题。过了一段时间,后来我在其它机器上通过 scl 部署 gcc 时,发现现在 scl 仓库中已经不提供 devtoolset-4 版本相关的 rpm 包了。

通过 yum list 可以看到 devtoolset 还有其它版本,比如 7、8、9,所以我们可以安装更高的版本。

我在安装 devtoolset-7 相关数据包后,编译程序时,报错 compiler-gcc7.h 文件找不到,通过 locate 查看确实没有 compiler-gcc7.h 文件,系统默认包含有 3、4、5 相关的头文件。

通过查看可以知道,该头文件是 kernel-devel 包里的问题。

$ rpm -qf /usr/src/kernels/3.10.0-514.6.2.el7.toa.2.x86_64/include/linux/compiler-gcc4.h
kernel-devel-3.10.0-514.6.2.el7.toa.2.x86_64

系统中 kernel-devel 确实没有包含更高版本的头文件,也没有太好的办法,当时是将 compiler-gcc4.h 复制为 compiler-gcc7.h ,编译不再报错了,程序也能够正常运行

所以 scl 确实是升级 gcc 的一种很好用的方式。。。

你可能感兴趣的:(工具&技巧)