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

CentOS 7.9 开发环境

为什么需要 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 工具链构建源码包

前置条件:

整体流程: 更新 yum 源 → 安装 SCL → 替换 SCL 源 → 安装 devtoolset-8 → 安装网卡/项目开发包

1. 更新 yum 源

CentOS 7 官方源已停止维护(EOL),且国内访问较慢,建议替换为国内镜像源。实测推荐中科大(USTC)腾讯云的镜像。

方式一:手动替换源。 以中科大为例如下(各镜像站帮助页均提供对应的一键替换命令):

1
2
3
4
5
6
7
8
9
# 备份官方源,便于回退
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

# 下载中科大 CentOS 7 源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.ustc.edu.cn/repo/centos/7/CentOS-Base.repo

# 清理缓存并重建
yum clean all
yum makecache

方式二:一键脚本换源(推荐)。 如果不想手动编辑 repo 文件,推荐使用社区维护的 linuxmirrors 一键换源脚本。执行后按提示交互式选择镜像站(阿里云 / 腾讯云 / 中科大 / 网易等),脚本会自动完成源备份、替换与缓存刷新,操作更省心、不易出错:

1
2
# linuxmirrors 一键换源脚本(交互式选择镜像源)
bash <(curl -sSL https://linuxmirrors.cn/main.sh)

执行后按提示操作即可:选择镜像站时建议选阿里云或腾讯云,其余选项(是否备份原源、是否更新软件包等)按默认回车即可。脚本完成后会自动执行 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
2
3
4
5
6
7
[centos-sclo-sclo]
name=CentOS-7 - SCLo sclo
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/sclo/
# mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-sclo
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

3.2 修改 CentOS-SCLo-scl-rh.repo

1
vi /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo

[centos-sclo-rh] 段落内容替换为:

1
2
3
4
5
6
7
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/
# mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-rh
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

关键点: baseurl 必须指向可用镜像;gpgcheck=0 跳过 GPG 校验(镜像仓库一般可用);enabled=1 保持仓库启用。

3.3 刷新缓存

1
2
3
yum repolist
yum clean all
yum makecache

刷新后可执行 yum list available devtoolset-8*,确认能搜索到 devtoolset-8 相关软件包。

4. 安装 devtoolset-8 环境

4.1 安装编译工具链

1
2
3
yum -y install devtoolset-8-binutils
yum -y install devtoolset-8-gcc
yum -y install devtoolset-8-gcc-c++
  • 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
2
3
4
5
6
7
# 下载源码包(国内直连 GitHub 慢时,可参考《GitHub 访问慢/下载超时》中的加速方法)
wget -O exanic-2.4.1.tar.gz https://github.com/cisco/exanic-software/archive/refs/tags/v2.4.1.tar.gz

tar -xf exanic-2.4.1.tar.gz
cd exanic-software-2.4.1
make
make install

编译安装 ExaNIC 网卡驱动与用户态库(提供 exanic 接口,用于 ExaNIC 系列网卡的低延迟收发)。

5.2 ef_vi(OpenOnload)

OpenOnload 是 Solarflare 的高性能用户态网络栈,安装后提供 ef_vi 接口,可与 pcap 结合用于高性能抓包。仓库地址:https://github.com/rigtorp/openonload

1
2
3
4
5
6
7
8
9
10
11
# 克隆仓库(直接得到 openonload-201811-u1 目录)
git clone https://github.com/rigtorp/openonload.git openonload-201811-u1
cd openonload-201811-u1

# 如果脚本或部署流程必须要求原名 .tgz 包,可以直接打包出来:
cd ..
tar -czvf openonload-201811-u1.tgz openonload-201811-u1
cd openonload-201811-u1

chmod +x scripts/onload_install
./scripts/onload_install

5.3 libpcap

1
2
yum -y install libpcap
yum -y install libpcap-devel

libpcap 为抓包库,libpcap-devel 提供头文件与链接库(编译引用 pcap 的程序时需要)。

5.4 tinyxml

1
2
yum -y install tinyxml
yum -y install tinyxml-devel

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)