如何在 GitHub CI 中使用最新版本的 GCC?

问题描述

我在 GitHub 上有一个使用 GitHub CI 的 C++ 项目。我的工作流配置为通过 strategy 属性在 Linux 和 Windows 上运行:

runs-on: ${{ matrix.os }}
strategy:
  matrix:
    os: [ubuntu-latest,windows-latest]

到目前为止,这对我来说效果很好,Cmake 将编译器标识为 GNU 9.3.0。但是,我现在想在我的项目中使用 GCC 10 中添加的实验性功能,因此由于旧的编译器版本,我的构建失败。

如何从我的 GitHub CI 工作流中使用更新版本的 GCC?

解决方法

对于 linux 构建,您可以使用以下构建步骤将默认 gcc 切换为 gcc-10。

- name: switch to gcc-10 on linux
  if: matrix.configurations.os == "ubuntu-latest"
  run: |
    sudo apt install gcc-10 g++-10
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10
    sudo update-alternatives --set gcc /usr/bin/gcc-10

脚本中的前两行应该是可选的,因为 gcc-10 已经安装在 ubuntu-latest 中。但是将它们放在那里并没有太大的伤害,它可能有助于弄清楚正在发生的事情以及如何在本地重现构建。 如果您对它的工作原理感兴趣,可以查看 manpage for update-alternatives

windows-latest 使用 Visual-studio 作为默认编译器,但由于您只询问了 gcc,我想它已经支持您正在使用的 c++ 功能?

,

@wirew0rm​​ 发布了一个很好的答案,一般来说效果很好。需要注意的是,允许在 GitHub CI 运行器上使用 sudo,因此只需安装所需的包:

sudo apt install gcc-10 g++-10

# or
sudo apt install gcc-11 g++-11

# or,for very recent Clang:
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 12
sudo apt-get install libc++-12-dev libc++abi-12-dev

然后,因为我使用的是 CMake,所以我可以设置 CXX 环境变量而不是使用 sudo update-alternatives

echo "CXX=g++-10" >> $GITHUB_ENV

随后的 CMake 配置步骤将选择 g++-10 作为 C++ 编译器。