CentOS 7.9 C++ 编译环境搭建(devtoolset-8)
本文以 CentOS 7.9 服务器(x86_64)为例,介绍 C++ 编译环境的完整搭建过程:先更换 yum 镜像源,再通过 SCL 安装高版本 GCC(devtoolset-8,gcc 8.3.1),最后安装 ExaNIC / ef_vi / libpcap 等网卡高性能开发包。搭建完成后,即可编译依赖 C++14 / C++17 特性或网卡低延迟接口的项目。

为什么需要 devtoolset-8: CentOS 7.9 系统自带的 gcc 为 4.8.5,仅完整支持 C++11(大部分 C++14 / C++17 特性不支持),无法编译依赖新标准的项目。SCL(Software Collections,软件集合) 允许在系统中并行安装新版工具链而不影响系统默认环境;devtoolset-8 提供 gcc 8.3.1(完整支持 C++14 及大部分 C++17),通过 scl enable 按需激活使用。
适用场景:
- 项目依赖 C++14 / C++17 特性,系统自带 gcc 4.8.5 编译报错
- 需要 ExaNIC / ef_vi / libpcap 等网卡高性能开发库(低延迟收发、抓包)
- 需要 automake / autoconf / libtool 等 Autotools 工具链构建源码包
前置条件:
- CentOS 7.9 服务器(x86_64 架构,以下命令需 root 权限或 sudo)
- 服务器可访问外网(需要下载软件包)
- 已备好网卡源码包:
- ExaNIC:
exanic-2.4.1.tar.gz,下载地址 https://github.com/cisco/exanic-software/archive/refs/tags/v2.4.1.tar.gz - OpenOnload:克隆 https://github.com/rigtorp/openonload 仓库(见 5.2 节)
- ExaNIC:
整体流程: 更新 yum 源 → 安装 SCL → 替换 SCL 源 → 安装 devtoolset-8 → 安装网卡/项目开发包
1. 更新 yum 源
CentOS 7 官方源已停止维护(EOL),且国内访问较慢,建议替换为国内镜像源。实测推荐中科大(USTC) 或腾讯云的镜像。
方式一:手动替换源。 以中科大为例如下(各镜像站帮助页均提供对应的一键替换命令):
1 | # 备份官方源,便于回退 |
方式二:一键脚本换源(推荐)。 如果不想手动编辑 repo 文件,推荐使用社区维护的 linuxmirrors 一键换源脚本。执行后按提示交互式选择镜像站(阿里云 / 腾讯云 / 中科大 / 网易等),脚本会自动完成源备份、替换与缓存刷新,操作更省心、不易出错:
1 | # linuxmirrors 一键换源脚本(交互式选择镜像源) |
执行后按提示操作即可:选择镜像站时建议选阿里云或腾讯云,其余选项(是否备份原源、是否更新软件包等)按默认回车即可。脚本完成后会自动执行 yum clean all / yum makecache。若因网络原因脚本下载失败,可先执行 curl -fsSL https://linuxmirrors.cn/main.sh -o main.sh 下载,再运行 bash main.sh。
2. 安装 SCL
SCL 仓库包(centos-release-scl)提供 devtoolset 等软件集合,安装命令:
1 | yum -y install centos-release-scl |
安装完成后会生成两个仓库配置文件:
/etc/yum.repos.d/CentOS-SCLo-scl.repo/etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
3. 替换 SCL 源
上一步安装的 SCL 仓库默认指向 CentOS 官方地址,目前官方 SCL 仓库已停止维护,如果不替换源,后续执行 yum install devtoolset-8-* 会提示找不到软件包。需要将两个 repo 文件中的 baseurl 改为国内镜像(以阿里云为例)。
3.1 修改 CentOS-SCLo-scl.repo
1 | vi /etc/yum.repos.d/CentOS-SCLo-scl.repo |
将 [centos-sclo-sclo] 段落内容替换为:
1 | [centos-sclo-sclo] |
3.2 修改 CentOS-SCLo-scl-rh.repo
1 | vi /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo |
将 [centos-sclo-rh] 段落内容替换为:
1 | [centos-sclo-rh] |
关键点: baseurl 必须指向可用镜像;gpgcheck=0 跳过 GPG 校验(镜像仓库一般可用);enabled=1 保持仓库启用。
3.3 刷新缓存
1 | yum repolist |
刷新后可执行 yum list available devtoolset-8*,确认能搜索到 devtoolset-8 相关软件包。
4. 安装 devtoolset-8 环境
4.1 安装编译工具链
1 | yum -y install devtoolset-8-binutils |
devtoolset-8-gcc:gcc 8.3.1 编译器(C 语言)devtoolset-8-gcc-c++:g++ 8.3.1 编译器(C++ 语言,支持 C++14 / C++17)devtoolset-8-binutils:汇编器、链接器等二进制工具
4.2 激活环境
devtoolset 安装后不会自动生效,需要激活后才可使用新版本 gcc:
1 | scl enable devtoolset-8 bash |
说明:
scl enable仅对当前终端会话生效,退出终端后失效。若希望默认启用,可将该命令追加到~/.bashrc,或写入/etc/profile.d/devtoolset-8.sh。
4.3 验证安装
1 | gcc -v |
确认输出为:
1 | gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC) |
同时可用 which gcc 确认编译器路径为 /opt/rh/devtoolset-8/root/usr/bin/gcc。
5. 安装网卡与项目开发包
以下为本项目编译所需的网卡高性能库与其他依赖,按需安装。
5.1 ExaNIC / Exablaze 网卡软件包
源码包可从 GitHub 下载(tag v2.4.1,解压后目录为 exanic-software-2.4.1):
1 | # 下载源码包(国内直连 GitHub 慢时,可参考《GitHub 访问慢/下载超时》中的加速方法) |
编译安装 ExaNIC 网卡驱动与用户态库(提供 exanic 接口,用于 ExaNIC 系列网卡的低延迟收发)。
5.2 ef_vi(OpenOnload)
OpenOnload 是 Solarflare 的高性能用户态网络栈,安装后提供 ef_vi 接口,可与 pcap 结合用于高性能抓包。仓库地址:https://github.com/rigtorp/openonload。
1 | # 克隆仓库(直接得到 openonload-201811-u1 目录) |
5.3 libpcap
1 | yum -y install libpcap |
libpcap 为抓包库,libpcap-devel 提供头文件与链接库(编译引用 pcap 的程序时需要)。
5.4 tinyxml
1 | yum -y install tinyxml |
tinyxml 为 C++ 轻量级 XML 解析库,tinyxml-devel 提供头文件与链接库,供项目解析 XML 配置或数据文件。
5.5 tcmalloc(gperftools)
1 | yum install -y gperftools-devel |
gperftools-devel 提供 Google 性能工具集,核心是 tcmalloc 内存分配器——在多线程高并发场景下比系统默认分配器(glibc malloc)开销更低、性能更好;同时附带 CPU / 堆分析器(pprof)等调优工具。若项目仅需 tcmalloc 或性能分析,安装本包即可。
5.6 GNU Autotools 工具链
如果编译时提示缺少 aclocal-1.13,说明 automake 版本过旧或未安装,执行:
1 | yum install -y automake autoconf libtool m4 perl |
automake:提供aclocal(生成 aclocal.m4)autoconf:生成 configure 脚本libtool:处理动态库的编译链接m4:宏处理器,autoconf 的依赖perl:部分构建脚本依赖
6. 常见问题排查
1. 安装 devtoolset-8 提示找不到软件包
- 确认第 3 步已替换 SCL 源并执行
yum makecache - 执行
yum list available devtoolset-8*验证仓库中是否存在软件包
2. 关闭终端后 gcc 又变回 4.8.5
scl enable 只对当前会话生效,需要永久生效时把命令写入 ~/.bashrc。
3. gcc -v 显示仍是 4.8.5
- 确认已在同一次会话中执行过
scl enable devtoolset-8 bash - 用
which gcc检查路径是否指向/opt/rh/devtoolset-8/root/usr/bin/gcc
4. 编译报错缺少 aclocal-1.13
安装 automake 等 Autotools 工具链(见 5.6 节),并确认 PATH 中包含对应版本。
5. 缺少 build 目录
1 | yum install kernel-devel-$(uname -r) |
